帮助我弄清楚这种情况下发生了什么:
想象你有一个具有以下属性的视图控制器
@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
有关。
如果你更改动画师中的其他属性(例如opacity
或transform
),动画师的工作方式与我预期的一样(当应用程序进入后台时没有任何变化)。
我错过了什么或是UIKit错误吗?
答案 0 :(得分:1)
<强>解决方案强>
每当应用程序恢复时(例如在viewWillAppear
中),请将动画的当前状态设置为所需的值。
<强>解释强>
正如您在问题中提到的,UIVisualEffectView
与UIViewPropertyAnimator
相比更是一个问题。
要以交互方式为UIVisualEffectView
的模糊设置动画,另一种解决方案是暂停图层的动画,方法是将其speed
设置为0
并修改图层的timeOffset
。我提到这一点是因为当应用程序从后台返回时,它的副作用是没有恢复到正确的timeOffset
。我怀疑这里发生了类似的事情。