了解同时Animate的持续时间行为

时间:2017-03-04 06:49:25

标签: swift xcode animation uiviewanimation

我无法理解同时(animateWithDuration:animations:completion :)方法调用如何在两个动画显示给定View的相同属性的情况下彼此交互。

我创建了以下测试项目来说明我看到的行为与我理解文档的方式完全相反。这是:

//
//  ViewController.swift
//  AnimationTest
//
//  Created by Jeremie Benhamron on 2017-03-03.
//  Copyright © 2017 beenie.inc. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Create and add a colored square
        let coloredSquare = UIView()

        // set background color to blue
        coloredSquare.backgroundColor = UIColor.blue

        // set frame (position and size) of the square
        coloredSquare.frame = CGRect(x: 0, y: 120, width: 50, height: 50)

        // finally, add the square to the screen
        self.view.addSubview(coloredSquare)
        //First Animation 
        // animate square moving to the right
        UIView.animate(withDuration: 4.0,delay: 0.0,options: [],animations: {
            coloredSquare.frame.origin = CGPoint(x: 320-50, y: 120)
        },completion:{print($0)})
        UIView.commitAnimations()

        //second animation
        //animate square moving back to original position
        UIView.animate(withDuration: 5.0,delay:0,options:[UIViewAnimationOptions.beginFromCurrentState] , animations: {
            coloredSquare.frame.origin = CGPoint(x: 0, y: 120)
        },completion:{print($0)})
        UIView.commitAnimations()
    }

}

以下youtube link显示了运行此项目时模拟器中发生的情况。

控制台上还会打印以下内容:

真 真

我希望看到:

假 真

在控制台中,因为根据我的理解,第二个动画应该中断第一个动画,导致在动画完成之前执行完成块导致其输入参数设置为false。

其次我希望蓝色方块根本不移动,因为第二个动画应该在移动蓝色方块之前立即中断第一个动画。但相反,我认为两个动画同时发生了一些奇怪的叠加(因为蓝色方块没有达到我只包含第一个动画的程度)。

此外,如果您将第二个动画持续时间设置为等于第一个(即4.0),则蓝色方块根本不会移动,这表明它们的叠加会以某种方式取消。

同样奇怪的是,beginFromCurresntState选项似乎对广场的行为没有影响。

有人可以解释为什么动画1没有被动画2干扰?

1 个答案:

答案 0 :(得分:0)

此处不应使用对UIView.commitAnimations()的调用。

定义动画块有两种替代方法。较旧的一个使用UIView.beginAnimations()来启动块,然后使用UIView.commitAnimations()来完成它。不再推荐这样做。

目前的方法是使用just UIView.animate(withDuration:animations:completion :),动画会在旧的意义上自动提交。

但是,这不是Xcode 9.1和Swift 4绝对可重现的奇怪行为的原因......

似乎没有考虑选项.beginFromCurrentState。我认为没有任何区别,因为关闭它。

而不是在第二个动画完成之前完成的第一个动画,你将获得两个动作的数学加法。实际上,第二个动画被解释为“向左移动”,当您将第二个持续时间设置为小于第一个持续时间时,这个动画变得最明显;小广场在屏幕上划破,然后再慢慢地向后移动。迷人!