UIViewPropertyAnimator在应用程序生命周期中做了一些奇怪的事情

时间:2017-11-22 19:02:27

标签: ios swift animation uikit

帮助我弄清楚这种情况下发生了什么:

想象你有一个具有以下属性的视图控制器

@IBOutlet weak var blurView: UIVisualEffectView!
var animator: UIViewPropertyAnimator?

viewDidLoad()中你做了类似的事情

    animator = UIViewPropertyAnimator(
        duration: 1,
        curve: .easeOut,
        animations: {
            self.blurView.effect = UIBlurEffect(style: .light)
        })
    animator?.fractionComplete = 0

要查看工作中的模糊效果,您必须在其后面添加一些内容(例如UIImageView)。 你还有一个UISlider来玩动画:

@IBAction private func sliderDidChange(_ sender: UISlider) {
    animator?.fractionComplete = CGFloat(sender.value)
}

玩了一会儿后,你把应用程序放在后台然后回来。 你期待看到什么? 出于某种原因,动画在你进入后台时开始,当你回来时,动画处于最终状态! 但我注意到这种行为与UIVisualEffectView有关。 如果你更改动画师中的其他属性(例如opacitytransform),动画师的工作方式与我预期的一样(当应用程序进入后台时没有任何变化)。

我错过了什么或是UIKit错误吗?

1 个答案:

答案 0 :(得分:1)

<强>解决方案

每当应用程序恢复时(例如在viewWillAppear中),请将动画的当前状态设置为所需的值。

<强>解释

正如您在问题中提到的,UIVisualEffectViewUIViewPropertyAnimator相比更是一个问题。

要以交互方式为UIVisualEffectView的模糊设置动画,另一种解决方案是暂停图层的动画,方法是将其speed设置为0并修改图层的timeOffset。我提到这一点是因为当应用程序从后台返回时,它的副作用是没有恢复到正确的timeOffset。我怀疑这里发生了类似的事情。