姬長信(Redy)

6.3使用提交动画方式进行UIView层动画的创建

## 6.3 使用提交动画方式进行UIView层动画的创建 在6.2小节中使用创建UIView层过渡动画的方法都是带代码块参数的方法/uff0c开发者只需将要执行动画的属性更改代码放入代码块中即可。实际上/uff0c在iOS 4系统之前还有一种更加传统的方法来创建UIView层的过渡动画。 ### 6.3.1 使用提交动画方式进行UIView层过渡动画的创建 打开前面创建的UIViewAnimationTest工程/uff0c将touchesBegan中代码进行如下修改/uff1a ```objective-c override func touchesBegan(_ touches: Set, 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个部分/uff0c绝大部分代码都由UIView的类方法提供。 首先/uff0c使用UIView的类方法beginAnimations标记动画开始/uff0c这个方法中第1个参数设置此动画动作的标识符。在此方法与commitAnimations方法之间的代码为动画的参数配置与具体要执行的动画动作。 第2部分为动画的配置部分/uff0c这部分通过一系列UIView的类方法来对UIView层的属性过渡动画进行参数配置。setAnimationDelegate方法设置接收动画开始于结束消息的代理类对象/uff0csetAnimationWillStartSelector方法设置动画开始时回调的代理方法/uff0csetAnimationDidStopSelector方法设置动画结束后回调的代理方法。SetAnimationDuration方法设置动画执行的时间。setAnimationDalay方法设置动画延时多少秒后开始执行。setAnimationRepeatAutotrverses方法设置动画是否自动逆向执行/uff0c这个方法中的参数设置为true/uff0c则当动画顺向执行完毕后会自动逆向执行一次。setAnimationRepeatCount方法设置动画执行的循环次数。setAnimationCurve方法设置动画执行的时间函数类型/uff0c其枚举及意义如下所示。 ```objective-c public enum UIViewAnimationCurve : Int { case easeInOut // 淡入淡出 case easeIn // 仅仅淡入 case easeOut // 仅仅淡出 case linear //线性 } ``` 第3部分是执行动画的属性变化代码。 最后/uff0c调用UIView的类方法commitAnimations进行动画的提交/uff0c调用此方法之后/uff0c过渡动画开始正式执行。有两点需要注意/uff1a 1.上述过渡动画的4个部分顺序不能颠倒。 2.如果不调用setAnimationDelegate方法进行代理的设置/uff0c使用setAnimationWillStartSSelector与setAnimationDidStopSelector方法设置的回调方法将无效。 ### 6.3.2 两种UIView层动画创建方式的优劣简述 使用commit方式创建过渡动画的方法更加传统/uff0c兼容性也更加好一些/uff0c但是毋庸置疑/uff0c目前几乎所有iOS设备的版本都在iOS 4版本之上/uff0c实际上在应用中基本不存在这方面的兼容问题。从上面的代码进行比较也可以发现/uff0c使用代码块的方式和使用commit的方式完成相同的动画效果/uff0ccommit的方式更加复杂/uff0c代码量也偏多。如果进行组合动画的开发/uff0c代码块方式的优势就会更加明显了。因此/uff0c无论从方便开发者角度还是官方推荐的角度/uff0c使用代码块的方式进行UIView层过渡动画的开发都是开发者的首选。