无业游民

千里之行始于足下

导航

iOS学习笔记之QuartzCore框架

  iOS设备给用户视觉反馈其实都是通过QuartzCore框架来进行的,说白了,所有用户最终看到的显示界面都是图层合成的结果,而图层即是QuartzCore中的CALayer。

  通常我们所说的视图即UIView,并不是直接显示在屏幕上,而是在创建视图对象的时候视图对象会自动创建一个层,而视图对象把要显示的东西绘制在层上,待到需要显示时硬件将所有的层拷贝,然后按Z轴的高低合成最终的显示结果。

  CALayer本质上是一块包含一幅位图的缓冲区,由视图创建的层为隐式层,而手动创建的层称为显示层。

  如果要在iOS上能够有良好的用户体验,动画的过渡效果是必不可少的,而所有的动画效果都是通过CAAnimation类的子类(CAAnimation是抽象类)来完成的。CAAnimation类的子类包括了CAAnimationGroup,CAPropertyAnimation,CATransition,而CAPropertyAniamtion(同为抽象类)也衍生了CABasicAnimation和CAKeyframeAnimation。用UIView的animation实现的动画本质上也是通过CALayer来实现的,iOS系统中CALayer的很多属性都是隐含有动画效果的,如果不想要隐式动画或者想要显示动画效果,都可以通过CATransaction来设置是否显示动画效果。同时,在CATransaction内可同时修改多个属性,然后再一并同时渲染,另外CATransaction还是可嵌套的。

  CABasicAnimation是一个最多只能有两个关键帧的动画,而CAKeyframeAnimation除了可含有多个关键帧,而且还可以修改每个关键帧的速度。

  CATransition能够为层提供移出以及移入屏幕的效果。苹果提供的所有动画类型在http://iphonedevwiki.net/index.php/CATransition这里有介绍,但是api只开放了其中的四种,当然你可以调用未公开的api,但是假如苹果以后出于安全还是什么原因调整接口的话,就不一定能用了,所以最好还是不要调用私有api,况且还有许多可以替代的方法,例如@"flip”,@"pageCurl”这些type是属于未公开的,一般来说不应该调用这些做动画,下面的这句

1 [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];

  同样也可实现翻转的效果。再不行的话,还可以通过设置@"transform.rotation.y"这个keypath来旋转,或者直接通过CATransform3D来设置@"transform”属性。总而言之,没必要用未公开的api,会留下隐患,而且替代的方法很多

  变换过程中需要注意的是该CALayer的anchorPoint,也就是旋转缩放基准点,默认情况下是(0.5, 0.5)也就是在layer的中心。基准点如果变了,旋转或者缩放所得到的的结果将会不同。positionanchorPoint共同决定了CALayer的frame。

  再说说CATransform3D的一个很常用到的数值,那就是m34这个值,下面这段代码是从Xcode文档中得到的

1 CATransform3D aTransform = CATransform3DIdentity;
2 // the value of zDistance affects the sharpness of the transform.
3 zDistance = 850;
4 aTransform.m34 = 1.0 / -zDistance;

 默认情况下, m34的值为0,即zDistance为无穷大而(0,0,zDistance)点表示照相机(透视点)所在的位置,从照相机位置看到的影像在xy平面上的投影即是我们可以在手机屏幕中所看到的影像,下面的这个链接讲的很详细很准确,有兴趣的可以去看。http://geeklu.com/2012/07/ios-3d-perspective/

  上面讲了iOS里面所有的动画,但是还有一个很重要的没有讲,那就是动画的速度控制函数CAMediaTimingFunction。这个函数是用于描述时间和距离之间的关系,距离=toValue-fromValue, 时间=duration, 将它们标准化为1x1的空间,x,t取值在[0, 1]区间内。假设在时刻t(时间过去了duration*t)时,动画目标的位置应为 fromValue+x*(toValue-fromValue)。系统提供的四种函数的函数图如下,下面曲线的斜率表示动画的速率,从图中可以看出,kCAMediaTimingFunctionLinear为匀速运动,kCAMediaTimingFunctionEaseIn为加速运动,kCAMediaTimingFunctionEaseOut为减速运动,kCAMediaTimingFunctionEaseInEaseOut为先加速后减速运动。当然,苹果也提供了可自定义速度控制函数,通过initWithControlPoints:x1:y1:x2:y2可自定义两个插值点,然后所得的函数曲线为由(0,0),(x1,y1),(x2,y2),(1,1)这四个点为控制点的Bezier曲线。

standardtiming

 

  说了这么多,大概知晓了动画的原理,但是要做出很绚丽的动画还是需要很好地数学功底及勤加修炼的。当然很多时候我们不能为了炫而炫,毕竟很多时候用户使用应用是为了使用某个功能而不是专门来看动画的。

 启动页面,添加一个UIImageView,设置image为启动屏图片,然后对UIImageView进行动画即可。

用UIView的animation就可以实现图片切换动画,以及歌词平缓过渡动画。

先对下一个controller进行截图,然后进行动画,动画结束后显示下一个controller即可。

通过CATransition设置type,subtype即可实现层的各种切换。

posted on 2013-03-20 23:43  PeterHuang  阅读(8981)  评论(1编辑  收藏  举报