Ios 正确的方法做一个类似Twitter的面具加载动画?

Ios 正确的方法做一个类似Twitter的面具加载动画?,ios,swift,Ios,Swift,我一直在尝试制作一个类似于Twitter加载覆盖的加载屏幕: 我不确定我的做法是否是“正确”的做事方式。我关注的问题很多: 有没有更好的方法来选择各种屏幕尺寸的遮罩图像?遮罩需要延伸到屏幕边缘才能与背景色配合使用,因此我将其设置为手机可能边界的大小 动画处理是否正确?这是我第一次对任何东西使用CATransaction 我应该像现在这样将视图添加到选项卡栏控制器的视图中吗 有没有什么方法可以将其抽象出来,或者有更好的方法将其放入应用程序的生命周期中?到现在为止,我需要复制此代码,并将其放置在

我一直在尝试制作一个类似于Twitter加载覆盖的加载屏幕:

我不确定我的做法是否是“正确”的做事方式。我关注的问题很多:

  • 有没有更好的方法来选择各种屏幕尺寸的遮罩图像?遮罩需要延伸到屏幕边缘才能与背景色配合使用,因此我将其设置为手机可能边界的大小
  • 动画处理是否正确?这是我第一次对任何东西使用
    CATransaction
  • 我应该像现在这样将视图添加到选项卡栏控制器的视图中吗
  • 有没有什么方法可以将其抽象出来,或者有更好的方法将其放入应用程序的生命周期中?到现在为止,我需要复制此代码,并将其放置在任何可以作为起点的控制器上(到现在为止有两个控制器)
你可以在下面看到我写的内容:

override func viewDidLoad() {
    super.viewDidLoad()

    prepareLoadingOverlay()
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    animateMask()
}

var mask: CALayer?
var blueView: UIImageView?

func prepareLoadingOverlay() {
    let size = UIScreen.mainScreen().bounds.size

    var cutoutImage: UIImage?

    switch size.height {
    case 420:
        cutoutImage = CutoutMap.Image480 // UIImage
    case 568:
        cutoutImage = CutoutMap.Image568
    case 667:
        cutoutImage = CutoutMap.Image667
    case 736:
        cutoutImage = CutoutMap.Image736
    default:
        cutoutImage = CutoutMap.Image667
    }

    if let tabBarViewController = self.tabBarController,
        let cutout = cutoutImage {
            let containerFrame = tabBarViewController.view.frame

            blueView = UIImageView.init(frame: containerFrame)
            blueView!.image = UIImage.imageFromColor(Color.Blue)

            self.mask = CALayer()
            self.mask?.contents = cutout.CGImage
            self.mask?.bounds = CGRect(x: 0, y: 0, width: size.width, height: size.height)
            self.mask?.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            self.mask?.position = CGPoint(x: containerFrame.size.width/2, y: containerFrame.size.height/2)

            tabBarViewController.view.addSubview(blueView!)
            blueView!.layer.mask = self.mask
    }
}

func animateMask() {
    let size = UIScreen.mainScreen().bounds.size

    if let mask = self.mask {
        CATransaction.begin()
        CATransaction.setAnimationDuration(1)

        CATransaction.setCompletionBlock { () -> Void in
            CATransaction.begin()
            CATransaction.setAnimationDuration(1)
            CATransaction.setCompletionBlock { () -> Void in
                self.blueView?.removeFromSuperview()
            }
            mask.bounds = CGRect(x: 0, y: 0, width: size.width*15, height: size.height*15)
            CATransaction.commit()
        }
        mask.bounds = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        CATransaction.commit()
    }
}

在此方面的任何帮助都将不胜感激

不要对各种分辨率使用硬编码图像大小,只需将单个图像的大小设置为与窗口大小成比例。您是否没有得到预期的结果?在看代码之前,我首先想到的是使用比例变换。看起来您正在为边界设置动画。不要对各种分辨率使用硬编码图像大小,只需将单个图像的大小设置为与窗口大小成比例。您是否没有得到预期的结果?在看代码之前,我首先想到的是使用比例变换。看起来您正在设置边界的动画。