0

我目前的 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 状态停止吗?

4

1 回答 1

0

您正在咨询古代历史(您引用的答案来自 2010 年!)。过去确实,对于视图动画,已经动画的视图属性上排序动画会突然取消现有动画。但是在更新的 iOS 版本中,视图动画是附加的,这意味着默认情况下,新动画将与现有的飞行动画平滑结合。

于 2018-11-10T03:23:50.883 回答