【问题标题】:CAAnimation: Syncing view's alpha with presentation layer's opacityCAAnimation:将视图的 alpha 与表示层的不透明度同步
【发布时间】:2018-03-02 08:09:36
【问题描述】:

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

view.alpha = view.layer.presentationLayer.opacity

???

谢谢!

更新:

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

【问题讨论】:

  • 顺便说一下,我不知道你的动画是什么,但你可以考虑使用UIViewPropertyAnimator,在这种情况下你可以在应用离开前台时pauseAnimationstartAnimation当它重新进入前台时恢复它。但是,如果不知道您的动画到底是什么,就很难更具体。
  • @Rob 嗨,谢谢,我会试一试。我用有关动画的详细信息更新了我的问题。

标签: ios animation calayer caanimation cakeyframeanimation


【解决方案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
        }
    }

}

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

【讨论】:

  • 谢谢,我会勾选你的答案。实际上,当应用程序进入后台时,动画会自动删除,请参阅forums.developer.apple.com/thread/15796,我不知道这一点,并且在切换应用程序时看到了一些奇怪的行为,在看到链接中的答案后,我在应用程序进入前台时重新添加了动画。我有三个相互重叠的标签,我用不同的关键帧值对它们的opacity 进行动画处理以模拟交叉淡入淡出效果,但是当动画被删除时,它们都具有 alpha 1 以便它们相互重叠。
  • 我没有停止动画,因为我不认为当应用程序进入后台时它们会停止,而只是因为我希望它在我设置 alpha 之前停止。这是一种非常常见的模式:获取表示层值、停止动画、重置视图属性。
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 2017-12-13
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2013-01-29
  • 2018-12-07
  • 2011-02-19
相关资源
最近更新 更多