CAAnimation:将视图的alpha与表示层的不透明度同步

时间:2017-09-21 05:24:13

标签: ios animation calayer caanimation cakeyframeanimation

我使用opacity设置了视图图层的CAKeyframeAnimation动画,当app转到后台时,动画被移除,但我需要制作如果我这样做,则视图的alpha与动画相同:

view.alpha = view.layer.presentationLayer.opacity

???

谢谢!

更新

我有三个标签相互重叠,我使用关键帧动画来设置opacity的动画,使用不同的关键帧值(opacity)来模仿交叉渐变动画。问题是当应用程序转到后台时,动画会被移除(根据https://forums.developer.apple.com/thread/15796),因此它们都具有alpha 1并且彼此重叠,这就是为什么我想要将视图与其表示层同步的原因

1 个答案:

答案 0 :(得分:0)

如果目标是在应用程序进入后台时捕获opacity,则可以为UIApplicationDidEnterBackground添加观察者,捕获不透明度,取消动画并设置alpha 。例如,在斯威夫特:

class ViewController: UIViewController {

    @IBOutlet weak var viewToAnimate: UIView!

    private var observer: NSObjectProtocol!

    override func viewDidLoad() {
        super.viewDidLoad()

        observer = NotificationCenter.default.addObserver(forName: .UIApplicationDidEnterBackground, object: nil, queue: .main) { [weak self] notification in
            if let opacity = self?.viewToAnimate.layer.presentation()?.opacity {
                self?.viewToAnimate.layer.removeAllAnimations()
                self?.viewToAnimate.alpha = CGFloat(opacity)
            }
        }
    }

    deinit {
        NotificationCenter.default.removeObserver(observer)
    }

    // I'm just doing a basic animation, but the idea is the same whatever animation you're doing

    @IBAction func didTapButton(_ sender: Any) {
        UIView.animate(withDuration: 10) {
            self.viewToAnimate.alpha = 0
        }
    }

}

如果您的目标是即使应用程序被终止也要记住它,那么您需要将其保存在持久存储中。但是,如果您的目标是仅在应用暂停和/或在后台运行时设置alpha,则上述内容就足够了。