设置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上添加tableView设置代理属性

UIView之userInteractionEnabled属性介绍

如何停止 UIView 的警告可能无法响应选择器

从外部引用设置属性上的 .attributedText(可通过 NIB 加载的 UIView 内的插座访问)似乎失败

UIView 使用自定义属性有条件地为子视图设置动画