设置UIView属性是否显式停止/完成在同一属性上使用UIViewPropertyAnimator启动的现有动画
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置UIView属性是否显式停止/完成在同一属性上使用UIViewPropertyAnimator启动的现有动画相关的知识,希望对你有一定的参考价值。
我目前的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调用完成处理程序。
这与我在上面提到的资料中所读到的完全相反。请帮忙。到底发生了什么?如果要求,将分享应用程序代码。谢谢!!!
EDIT1
查看控制器代码
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的评论中,所说的是动画现在是附加的。这澄清了很多事情,但Apple的addAnimations(_:delayFactor :)文档说,我引用
如果动画块修改了由不同属性动画师修改的属性,则动画师会以最合适的方式组合它们的更改。对于许多属性,每个动画师的更改会相加,以产生新的中间值。如果无法以此附加方式修改属性,则新动画将接管,就像为基于视图的动画指定了beginFromCurrentState选项一样。
因此,如果新动画以隐式或显式方式接管beginFromCurrentState,那么当新动画接管时,第一个动画不应该以状态为.current停止吗?
您正在咨询古代历史(您引用的答案是从2010年开始!)。以前,对于视图动画,在已经设置动画的视图属性上排序动画会突然取消现有动画。但是在最近的iOS版本中,视图动画已经被添加,这意味着默认情况下,新动画将与现有的动画动画平滑地组合。
以上是关于设置UIView属性是否显式停止/完成在同一属性上使用UIViewPropertyAnimator启动的现有动画的主要内容,如果未能解决你的问题,请参考以下文章
我可以立即停止第一个 UIView 动画并在同一视图上启动第二个动画吗?
UIView之userInteractionEnabled属性介绍