3 UIView层动画的创建

在2小节中使用创建UIView层过渡动画的方法都是带代码块参数的方法,开发者只需将要执行动画的属性更改代码放入代码块中即可。

实际上,在iOS 4系统之前还有一种更加传统的方法来创建UIView层的过渡动画。

3.1 使用提交动画方式进行UIView层过渡动画的创建

打开前面创建的UIViewAnimationTest工程,将touchesBegan中代码进行如下修改:

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //第1部分 开始动画标志
        UIView.beginAnimations("test", context: nil)
        //第2部分 设置动画属性
        UIView.setAnimationDelegate(self)
        UIView.setAnimationWillStart(#selector(start))
        UIView.setAnimationDidStop(#selector(stop))
        UIView.setAnimationDuration(3)
        UIView.setAnimationDelay(1)
        UIView.setAnimationCurve(.easeInOut)
        UIView.setAnimationRepeatAutoreverses(true)
        UIView.setAnimationRepeatCount(3)
        //第3部分 设置要执行动画的属性
        colorView?.backgroundColor = UIColor.blue
        //第4部分 提交动画
        UIView.commitAnimations()
    }

使用commit方式进行UIView层过渡动画的创建主要分为4个部分,绝大部分代码都由UIView的类方法提供。

首先,使用UIView的类方法beginAnimations标记动画开始,这个方法中第1个参数设置此动画动作的标识符。在此方法与commitAnimations方法之间的代码为动画的参数配置与具体要执行的动画动作。

第2部分为动画的配置部分,这部分通过一系列UIView的类方法来对UIView层的属性过渡动画进行参数配置。setAnimationDelegate方法设置接收动画开始于结束消息的代理类对象,setAnimationWillStartSelector方法设置动画开始时回调的代理方法,setAnimationDidStopSelector方法设置动画结束后回调的代理方法。

SetAnimationDuration方法设置动画执行的时间。setAnimationDalay方法设置动画延时多少秒后开始执行。setAnimationRepeatAutotrverses方法设置动画是否自动逆向执行,这个方法中的参数设置为true,则当动画顺向执行完毕后会自动逆向执行一次。

setAnimationRepeatCount方法设置动画执行的循环次数。setAnimationCurve方法设置动画执行的时间函数类型,其枚举及意义如下所示。

public enum UIViewAnimationCurve : Int {
    case easeInOut // 淡入淡出
    case easeIn //   仅仅淡入
    case easeOut // 仅仅淡出
    case linear  //线性
}

第3部分是执行动画的属性变化代码。

最后,调用UIView的类方法commitAnimations进行动画的提交,调用此方法之后,过渡动画开始正式执行。有两点需要注意: 1.上述过渡动画的4个部分顺序不能颠倒。 2.如果不调用setAnimationDelegate方法进行代理的设置,使用setAnimationWillStartSSelector与setAnimationDidStopSelector方法设置的回调方法将无效。

3.2 两种UIView层动画创建方式的优劣简述

使用commit方式创建过渡动画的方法更加传统,兼容性也更加好一些,但是毋庸置疑,目前几乎所有iOS设备的版本都在iOS 4版本之上,实际上在应用中基本不存在这方面的兼容问题。

从上面的代码进行比较也可以发现,使用代码块的方式和使用commit的方式完成相同的动画效果,commit的方式更加复杂,代码量也偏多。如果进行组合动画的开发,代码块方式的优势就会更加明显了。

因此,无论从方便开发者角度还是官方推荐的角度,使用代码块的方式进行UIView层过渡动画的开发都是开发者的首选。