AnimationDeamon: 守护动画

528 阅读1分钟

AnimationDeamon

功能

防止循环动画在以下情况下被暂停播放:

  • UIApplication didEnterBackground
  • UIViewController viewDidDisappear

原理

原理是监听动画的控件, 同时传递一个回调函数。在需要恢复动画的时候,就会调用回调来重新运行一次动画。

UIApplication didEnterBackground

监听 UIApplicationwillEnterForegroundNotificationdidEnterBackgroundNotification, 在APP回到前台的时候调用回调恢复动画

UIViewController viewDidDisappear

替换 UIViewControllerviewDidAppear 方法,在 viewDidAppear 的调用回调恢复动画

示例代码

/// zoom
public static func zoom(view: UIView,
                        from min: CGFloat = 0.8, to max: CGFloat = 1.5,
                        duration: TimeInterval = 0.6,
                        repeats: Bool = true) {

    let animations: [Animation] = [
        AnimationType.zoom(scale: min),
        AnimationType.zoom(scale: max),
        AnimationType.zoom(scale: 1.0),
    ]

    let options: UIView.AnimationOptions = [.repeat, .autoreverse, .curveLinear,
                                            .curveEaseInOut, .allowUserInteraction]

    view.animate(animations: animations, reversed: false,
                 initialAlpha: 1, finalAlpha: 1, delay: 0,
                 duration: duration, options: options) {}

    // Deamon Animation
    AnimationDeamon.deamon(view: view) { (view) in
        zoom(view: view, from: min, to: max, duration: duration, repeats: repeats)
    }
}