我目前的 iOS 开发知识水平是我对它还很陌生,并且处于学习阶段。提供此信息,以便专家可以相应地回答:)
根据斯坦福的 iOS 开发课程,如果针对同一属性启动另一个动画,则 UIView 属性的动画将被中断(更具体地说,新动画开始处理前一个动画的一个属性)。
链接到视频中教授这一点的确切点https://youtu.be/84ZhYhAwYqo?t=209
同样相当相似的事情也被说成是对 stackoverflow 问题的回答。直接链接回答https://stackoverflow.com/a/3076451/8503233
但是当我尝试这样做时,它没有发生。
为了测试这一点,我制作了一个简单的应用程序,单击按钮开始使用 UIViewPropertyAnimator.runningPropertyAnimator 为视图设置动画,其中将 alpha 更改为 0。持续时间设置为 10 秒,以便我有足够的时间来触发另一个动画。
然后另一个按钮将启动一个动画,将同一视图的 alpha 更改为 1。我预计当第二个动画开始时,它会导致第一个动画停止并使用 UIViewAnimatingPosition 的值为 .current 调用其完成处理程序.
但是我发现即使第二个动画开始时,第一个动画仍在运行,并且在运行了完整的持续时间后,完成处理程序被称为 UIViewAnimatingPosition 作为 .end。
这与我在上面给出的资料中所读到的完全相反。请帮忙。这里到底发生了什么。如果要求,将共享应用程序代码。谢谢!!!
编辑1:
查看控制器代码
class MyViewController: UIViewController {
@IBOutlet weak var viewToAnimate: UIView!
@IBOutlet weak var statusView: UIView!
@IBAction func buttonAnimate1(_ sender: UIButton) {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 5, delay: 0, options: [], animations: {
self.viewToAnimate.alpha = 0.1
}, completion: {position in
switch position {
case .start:
print("In animation 1 completion block with position = start")
case .current:
print("In animation 1 completion block with position = current")
case .end:
print("In animation 1 completion block with position = end")
}
self.statusView.backgroundColor = UIColor.brown
})
}
@IBAction func buttonAnimate2(_ sender: UIButton) {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 5, delay: 0, options: [.beginFromCurrentState], animations: {
self.viewToAnimate.alpha = 1
}, completion: {position in
switch position {
case .start:
print("In animation 2 completion block with position = start")
case .current:
print("In animation 2 completion block with position = current")
case .end:
print("In animation 2 completion block with position = end")
}
self.statusView.backgroundColor = UIColor.green
})
}
@IBAction func buttonRestore(_ sender: UIButton) {
viewToAnimate.alpha = 1
statusView.backgroundColor = UIColor.yellow
}
}
测试步骤:
在模拟器中,我按下 Animate1 按钮,然后大约 1 秒后,按下 Animate2 按钮。
控制台输出:
In animation 1 completion block with position = end
In animation 2 completion block with position = end
在@matt 的评论中,动画现在是附加的。这澄清了很多事情,但苹果的addAnimations(_:delayFactor:)文档说,我引用
如果动画块修改了由不同属性动画师修改的属性,则动画师以最合适的方式组合他们的更改。对于许多属性,来自每个动画师的更改被加在一起以产生一个新的中间值。如果无法以这种附加方式修改属性,则新动画将接管,就好像已经为基于视图的动画指定了 beginFromCurrentState 选项一样。
因此,如果一个新动画隐式或显式地作为 beginFromCurrentState 接管,那么当新动画接管时,第一个动画不应该以 .current 状态停止吗?