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

CAAnimation: Syncing view's alpha with presentation layer's opacity

我正在使用 CAKeyframeAnimation 为视图层的 opacity 设置动画,当应用程序进入后台时,动画被移除,但我需要使视图的 alpha 与动画,我该怎么做:

view.alpha = view.layer.presentationLayer.opacity

???

谢谢!

更新:

我有三个相互重叠的标签,我使用关键帧动画为它们的 opacity 设置不同关键帧值(对于 opacity)的动画,以模仿交叉淡入淡出动画。问题是当应用程序进入后台时,动画被删除(根据 https://forums.developer.apple.com/thread/15796)所以它们都有 alpha 1 并且彼此重叠,这就是为什么我想将视图与它们的表示层同步。

如果目标是在应用程序进入后台时捕获 opacity,您可以为 UIApplicationDidEnterBackground 添加一个观察者,捕获不透明度,取消动画,并设置 alpha.例如,在 Swift:

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
        }
    }

}

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