iOS 官方文档阅读之动画

写于开头


最近开始阅读苹果IOS开发文档,发现果然还是官方文档里有价值的东西多。之后会随着阅读的进度,陆续写一些的阅读文章,大部分是文档内容的摘录(英文不太好,有些地方翻译会有些生硬)。将所看到的有帮助的文档中的内容记录下来,也算是一种总结。

本文所对应的官方文档:《View Programming Guide for iOS》 其中的Animations部分。

动画


什么能够使用动画

UIKit框架和Core Animation都提供了对动画的支持,但是这两种技术对动画的支持程度有所不同。UIKit框架是通过UIView对象来支持动画的。UIView包含了一些支持动画的属性,但这并不意味着动画会自动产生。改变这些属性通常只是立即更新UIView对象的属性值,并不会有动画产生。想要使这些改变产生动画,你必须在一个动画块中改变这些属性值。

以下列出UIView中支持动画的属性:

  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch

在一些需要展示更复杂动画或者不被UIView类所支持的动画的场合,能够使用Core Animation和视图下面的图层来创建动画。由于视图和图层对象是错综联系在一起的,所以改变视图的涂层会影响到视图本身。使用Core Animation,你能为一下视图图层的改变添加动画:

  • 图层的大小和位置
  • 执行变形时的中心点
  • 3D空间中图层以及其子图层的变形
  • 图层从其所在图层层级中的添加或者删除
  • 图层与其兄弟图层间的Z-order关系
  • 图层的阴影
  • 图层的边框(包括图层是否圆角)
  • 改变大小操作中图层部分的拉伸
  • 图层的不透明度
  • 子图层在父图层边框以外部分的裁剪行为
  • 图层当前的内容
  • 图层的光栅化行为

注意: 如果视图包含了自定义的图层对象——也就是说,图层对象没有关联的视图——任何该图层的变化动画,都必须使用Core Animation来完成。

视图动画属性的改变

UIView类对象属性改变所产生动画的代码写法有两种:如果在iOS4以后的系统,可以使用代码块对象,更早的系统中可以使用Begin/Commit函数。

代码块可以使用的函数:

  • animateWithDuration:animations:
  • animateWithDuration:animations:completion:
  • animateWithDuration:delay:options:animations:completion:

以上这些函数,都是UIView的类函数。正是由于是类函数,在其中的动画块代码不仅仅只展示单一的视图,可以包含多个视图的变化。

如果应用程序是运行在iOS3.2及更早的版本,需要使用UIView的以下两个类函数:

beginAnimations:context:
commitAnimations

来定义动画代码块。这两个函数标记了动画代码块的开始和结束位置。

注意: 如果所写的应用程序是运行在iOS4及以上的环境中,应该使用基于块的函数

默认情况下,在一个动画块中所有动画属性的改变都会被展示。如果只希望其中一部分的变化以动画来表示,其余的不用。那么使用setAnimationsEnabled:函数可以暂时使动画失效,之后做任何不想使用动画的改变,然后再调用一次setAnimationsEnabled: *函数来启用动画。还能通过调用areAnimationsEnabled* 函数来查看当前动画的可用状态。

为Begin/Commit函数配置参数

Begin/Commit函数有许多动画参数可以配置,需要通过使用UIView的一些类函数来完成。

配置参数的函数列表详见文档。

设置动画代理

如果希望在一段动画结束之后立即执行一段代码,需要为Begin/Commit函数关联一个代理对象和一个开始或者结束的选择器。通过UIView的类函数setAnimationDelegate:设置代理对象,类函数setAnimationWillStartSelector:setAnimationDidStopSelector: 设置开始结束选择器。

动画代理方法应该与以下形式类似:

- (void)animationWillStart:(NSString *)animationID context:(void *)context;
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;
改变一个视图的子视图

当一个视图的子视图发生改变时,若需要动画来过渡,则需要使用函数transitionWithView:duration:options:animations:completion:来完成。

使用一个视图来替换另一个视图

当使用一个视图来替换另一个视图时,若需要动画过渡,则需要使用函数transitionFromView:toView:duration:options:completion:来完成

其他

可以使用完成块或者代理函数来完成多个动画的连接。

基于视图和基于图层的动画可以混合在一起使用。



Previous     Next
nswebfrog /
Published under (CC) BY-NC-SA in categories iOS  tagged with iOS