IOS的动画实现方式

来源:互联网 发布:windows全部历代系统 编辑:程序博客网 时间:2024/05/20 10:12

IOS提供了一系列核心动画类的接口来创建动态用户界面。核心动画类提供了以下一些方法:

1.对视图的图层类进行几何变换

图层主要用来显示内容的。每一个视图都默认创建其对应的图层最为根图层,其维护着一个图层类的集合,它们构成了一个图层树的层次结构,进行自底向上的绘制。我们可以改变图层的一些属性和进行图层位置的几何变换产生动画效果。


图层树包含每一层的对象模型值。他们就是你设定的图层的属性值。
呈现树包含了当前动画发生时候将要显示的值,例如你要给图层背景颜色设置新的值的时候,它会立即修改图层树里面相应的值。但是在呈现树里面背景颜色值在将要显示给用户的时候才被更新为新值。
渲染树在渲染图层的时候使用呈现树的值。渲染树负责执行独立于应用活动的复杂操作。渲染由一个单独的进程或线程来执行,使其对应用程序的运行循环影响最小。
 

图层一旦创建,你就可以通过矩阵变换来改变一个图层的几何形状。 CATransform3D 的数据结构定义一个同质的三维变换(4x4 CGFloat 值的矩阵),用于 图层的旋转,缩放,偏移,歪斜和应用的透视。
图层的两个属性指定了变换矩阵:transform 和 sublayerTransform 属性。图层的 transform 属性指定的矩阵结合图层的 anchorPoint 属性作用于图层和图层的子图层上 面。图 3 显示在使用 anchorPoint 默认值(0.5,0.5)的时候旋转和缩放变换如何影响一
个图层。图层的 sublayerTransform 属性指定的矩阵只会影响图层的子图层,而不会对 图层本身产生影响。
你可以通过以下的任何一个方法改变 CATransform3D 的数据结构: 

 1.使用CATransform3D函数,如:

CATransform3D transform = CATransform3DIdentity;
transform.m34 = 0.0005; // 透视效果
transform = CATransform3DRotate(transform,(M_PI/180*40), 0, 1, 0);
[self.view.layer setTransform:transform];

2.直接修改数据结构的成员,如:

CATransform3D aTransform = CATransform3DIdentity;
zDistance = 850;
aTransform.m34 = 1.0 / -zDistance;
3.使用键-值编码改变键路径,如:

[self.view.layer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"];


CATransform3DIdentity 是单位矩阵,该矩阵没有缩放、旋转、歪斜、透视。把该 矩阵应用到图层上面,会把图层几何属性修改为默认值。


图层创建以后,你可以通过改变图层的几何属性:frame、bounds、position、 anchorPoint 和 zPosition 来编程式移动和改变图层大小。
如果一个图层的属性 needsDisplayOnBoundsChange 被设置为 YES 的时候,当图层 的 bounds 属性改变的时候,图层的内容将会被重新缓存起来。默认情况下图层的 needsDisplayOnBoundsChange 属性值为 NO。
默认情况下,设置图层的属性 frame、bounds、position、anchorPoint 和 zPosition 属性将会导致图层动画显示新值。

给CALayer提供内容,你可以通过以下任何一种方法指定 CALayer 实例的内容:
1.使用包含图片内容的 CGImageRef 来显式的设置图层的 contents 的属性。

2. 指定一个委托,它提供或者重绘内容。
3.继承 CALayer 类重载显示的函数。


2.使用动画和计时类

核心动画提供了一套你可以在你应用程序里面使用的动画类的表现:
1.CABasicAnimation提供了在图层的属性值间简单的插入。
2.CAKeyframeAnimation 提供支持关键帧动画。你指定动画的一个图层属性的关键路径,一个表示在动画的每个阶段的价值的数组,还有一个关键帧时间的数组和时间函数。
3.CATransition提供了一个影响整个图层的内容过渡效果。在动画显示过程中采用淡出(fade)、推出(push)、显露(reveal)图层的内容。 常用的过渡效果可以通过提供你自己定制的核心图像滤镜来扩展。 除了要指定显示的动画类型,你还必须指定动画的间隔、它的速度(它的插值如何分布在整个动画过程)、动画循环时候的循环次数、动画周期完成的时候是否自动 的反转、还有动画结束的时候它的可视化状态。动画类和 CAMediaTiming 协议提供 所有这些功能甚至更多的功能

如:

CABasicAnimation *theAnimation;

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];

theAnimation.duration=3.0;

theAnimation.repeatCount=2;

theAnimation.autoreverses=YES;

theAnimation.fromValue=[NSNumber numberWithFloat:1.0];

theAnimation.toValue=[NSNumber numberWithFloat:0.0];


[theLayer addAnimation:theAnimation forKey:@"animateOpacity"];


3.使用事务类,在原子更新的时候组合图层类

图层的每个改变都是事务的一部分。CATransaction 是核心动画类,它负责成批的把多个图层树的修改作为一个原子更新到渲染树。在你修改图层树之前,可以通过给 CATransaction 类发送一个 begin 消息来创建一 个显式事务,修改完成之后发送 comit 消息。显式事务在同时设置多个图层的属性的 时候(例如当布局多个图层的时候),暂时的禁用图层的行为,或者暂时修改动画的 时间的时候非常有用。 

如:

[CATransaction begin];

[CATransaction setValue:[NSNumber numberWithFloat:10.0f]

forKey:kCATransactionAnimationDuration];

theLayer.zPosition=200.0;

theLayer.opacity=0.0;

[CATransaction commit];


4.使用UIView 提供的动画接口

如:

+ (void)beginAnimations:(NSString *)animationID context:(void *)context;  // additional context info passed to will start/did stop selectors. begin/commit can be nested

+ (void)commitAnimations;

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completionNS_AVAILABLE_IOS(4_0);

等等。

[UIViewanimateWithDuration:0.4

                          delay:0

         usingSpringWithDamping:5

          initialSpringVelocity:5

                        options:UIViewAnimationOptionCurveEaseOut

                     animations:^{

                         

                         toViewController.view.layer.transform =self.tempTransform;

                         toViewController.view.alpha =self.behindViewAlpha;

                         

                         fromViewController.view.frame =CGRectMake(0,0,

                                                                   CGRectGetWidth(fromViewController.view.frame),

                                                                   CGRectGetHeight(fromViewController.view.frame));

                         

                         

                     } completion:^(BOOL finished) {

                         [transitionContext completeTransition:NO];

                     }];



1 0
原创粉丝点击