二、 CoreAnimation——进行比较绚丽的动画,需要导入QuartzCore 、CoreGraphics这两个framework
核心动画类有以下分类:
ñ 提供显示内容的图层类。
ñ 动画和计时类。
ñ 布局和约束类。
ñ 事务类,将多个层分成几个原子更新的执行类
1. 层(CALayer)
CALayer本质上是一块包含一幅位图的缓冲区,由视图(UIView)创建的层为隐式层,而手动创建的层(layer)称为显示层。
bounds,frame,position//控制UIView的大小和位置,相互之间的数值变化会相互影响
anchorPoint//单位参数(0-1)表示,变形(transform)时候的变换基准点/*position和anchorPoint共同决定了CALayer的frame*/
shadowOpacity//shadow的透明度
shadowOffset//shadow在X和Y轴上延伸的方向,即shadow的大小
shadowPath//设置CALayer背景位置
shadowRadius//shadow的渐变距离,从外围开始,往里渐变shadowRadius距离
masksToBounds//可用来防止元素大小溢出父元素,如若防止溢出,设为true
borderWidth和borderColor//边框宽度和颜色
opacity//UIView的透明效果
cornerRadius//UIView的圆角
contentsGravity//修改图层内容的位置。类似于uiview的contentsmode,是拉伸满整个view的bounds,还是在view上居中显示.
contentsRect:用于表述将要绘制的contentsimage的部分内容.使用这个属性,可以很方便的绘制一个大图的一部分,而不需要重绘或者改变contents image.同样可以使用contents rect缩小contents image,只需要把contents rect设置的比contents大,为了防止边缘效应,需要给contengs image一个清晰的像素边框
contentsCenter:用于描述当contentsgravity被设置成拉伸状态时,拉伸的中心.
needsdisplayonboundschange:yes说明bounds发生改变时重绘,无关contentsgravity;NO说明bounds发生改变时不重绘,只是利用cache的image采用contentgravity以及参考contentscenter拉伸.
transform//CATransform3D类型,相对于anchorPoint的变换。
/*CATransform3D包括CATransform3DMakeAffineTransform、CATransform3DMakeScale、CATransform3DRotate
三个重要的子类
(1)CAScrollLayer:它是CALayer的一个子类,用来显示layer的某一部分,一个CAScrollLayer对象的滚动区域是由其子层的布局来定义的。CAScrollLayer没有提供键盘或者鼠标事件,也没有提供明显的滚动条。
(2)CATextLayer:它是一个很方便就可以从string和attributedstring创建layer的content的类。
(3)CATiledLayer:它允许在增量阶段显示大和复杂的图像(就是将图形进行分块显示,来减少
2.动画和时间
动画分为隐式动画和显式动画。
隐式动画假定所有改变的可动画的layer属性应该是渐进和异步的。改变一个可动画的layer属性值可以隐含的引起一个动画使属性的值从旧值变为新值。
显式动画需要我们去创建一个animation对象,设置开始和结束值。一个明确的动画不会自动开始除非你将其应用到layer中。 可以通过发送消息addAnimation:forKey:给layer来启动显式动画,传递动画类和标识作为参数。一旦加入,显式动画就会开始运行直到其动画完成,或者从layer上remove。标识就是用来停止一个动画的,removeAnimationForKey:,也可以通过removeAllAnimations停止一个layer所有的动画。
所有的动画效果都是通过CAAnimation类的子类(CAAnimation是抽象类)来完成的。CAAnimation采用CAMediaTiming协议。CAMediaTiming规定了动画的持续时间,速度以及重复次数。CAAnimation也采用了CAAction协议,该协议规定了在响应由层触发的动作时,开始一个动画的标准方式。
CAAnimation类的子类包括了CAAnimationGroup、CAPropertyAnimation、CATransition
CAAnimationGroup允许将一组动画放在一个数组里面,然后同时执行。
CAPropertyAnimation支持层在动画期间,为层指定一个关键路径。而CAPropertyAniamtion(同为抽象类)也衍生了CABasicAnimation和CAKeyframeAnimation。
用UIView的animation实现的动画本质上也是通过CALayer来实现的,iOS系统中CALayer的很多属性都是隐含有动画效果的,如果不想要隐式动画或者想要显示动画效果,都可以通过CATransaction来设置是否显示动画效果。同时,在CATransaction内可同时修改多个属性,然后再一并同时渲染,另外CATransaction还是可嵌套的。
CATransition能够为层提供移出以及移入屏幕的效果(影响到整个layer的内容)。此动画可以用自己提供的自定义 core image filters去扩展
CABasicAnimation简单的为图层的属性提供修改。很多图层的属性修改默认会执行这个动画类。比如大小,透明度,颜色等属性;是一个最多只能有两个关键帧的动画,提供简单的layer属性值之间的修改;而CAKeyframeAnimation除了可含有多个关键帧,而且还可以修改每个关键帧的速度。
CAKeyframeAnimation提供了关键帧动画的支持。你可以指定的图层属性的关键路径动画,包括动画的每个阶段的价值,以及关键帧时间和计时功能的一系列值。
CAAnimation 实现了 CAMediaTiming协议,提供了动画的持续时间,速度,和重复计数。 CAAnimation 也实现了 CAAction协议。该协议为图层触发一个动画动作提供了提供标准化响应。
3.布局管理类
核心动画的 CAConstraint 类是一个布局管理器,它可以指定子图层类限制于你指定的约束集合。每个约束 (CAConstraint 类的实例封装)描述层的几何属性(左,右,顶部或底部的边缘或水平或垂直中心)的关系,关系到其同级之一的几何属性层或 superlayer。。
4.执行类
图层的动画属性的每一个修改必然是事务的一个部分。CATransaction 是核心动画里面负责协调多个动画原子更新显示操作。事务支持嵌套使用。
Function | Use |
CATransform3DMakeTranslation | Returns a transform that translates by ‘(tx, ty, tz)’. t’ = [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1]. |
CATransform3DTranslate | Translate ‘t’ by ‘(tx, ty, tz)’ and return the result: * t’ = translate(tx, ty, tz) * t. |
CATransform3DMakeScale | Returns a transform that scales by `(sx, sy, sz)’: * t’ = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]. |
CATransform3DScale | Scale ‘t’ by ‘(sx, sy, sz)’ and return the result: * t’ = scale(sx, sy, sz) * t. |
CATransform3DMakeRotation | Returns a transform that rotates by ‘angle’ radians about the vector ‘(x, y, z)’. If the vector has length zero the identity transform is returned. |
CATransform3DRotate | Rotate ‘t’ by ‘angle’ radians about the vector ‘(x, y, z)’ and return the result. t’ = rotation(angle, x, y, z) * t. |
表1 CATransform3D 变换函数 :偏移、旋转和缩放
1.CALayer类——实现了CAMediaTiming协议
相关属性如下:
bounds,frame,position//控制UIView的大小和位置,相互之间的数值变化会相互影响
anchorPoint//单位参数(0-1)表示,变形(transform)时候的变换基准点/*position和anchorPoint共同决定了CALayer的frame*/
shadowOpacity//shadow的透明度
shadowOffset//shadow在X和Y轴上延伸的方向,即shadow的大小
shadowPath//设置CALayer背景位置
shadowRadius//shadow的渐变距离,从外围开始,往里渐变shadowRadius距离
masksToBounds//可用来防止元素大小溢出父元素,如若防止溢出,设为true
borderWidth和borderColor//边框宽度和颜色
opacity//UIView的透明效果
cornerRadius//UIView的圆角
contentsGravity//修改图层内容的位置。类似于uiview的contentsmode,是拉伸满整个view的bounds,还是在view上居中显示.
表 1 layer的contentsGravity属性的定位常量
Position constant | Description |
kCAGravityTopLeft | Positions the content image in the top left corner of the layer. |
kCAGravityTop | Positions the content image horizontally centered along the top edge of the layer. |
kCAGravityTopRight | Positions the content image in the top right corner of the layer. |
kCAGravityLeft | Positions the content image vertically centered on the left edge of the layer. |
kCAGravityCenter | Positions the content image at the center of the layer. |
kCAGravityRight | Positions the content image vertically centered on the right edge of the layer. |
kCAGravityBottomLeft | Positions the content image in the bottom left corner of the layer. |
kCAGravityBottom | Positions the content image centered along the bottom edge of the layer. |
kCAGravityBottomRight | Positions the content image in the top right corner of the layer. |
图 2 Layer的 contentsGravity 属性的缩放常量
///**注意:使用任何常量kCAGravityResize、kCAGravityResizeAspect和kCAGravityResizeAspectFill和表1中的重心位置常量无关。图层的内容将会填充整个边界,所以使用这些常量无法改变图层内容的位置。**/
transform//CATransform3D类型,相对于anchorPoint的变换。
/*CATransform3D包括CATransform3DMakeAffineTransform、CATransform3DMakeScale、CATransform3DRotate
三个重要的子类
(1)CAScrollLayer:它是CALayer的一个子类,用来显示layer的某一部分,一个CAScrollLayer对象的滚动区域是由其子层的布局来定义的。CAScrollLayer没有提供键盘或者鼠标事件,也没有提供明显的滚动条。
(2)CATextLayer:它是一个很方便就可以从string和attributedstring创建layer的content的类。
(3)CATiledLayer:它允许在增量阶段显示大和复杂的图像(就是将图形进行分块显示,来减少
2. CAAnimation类——实现了CAMediaTiming、CAAction协议
包括CAAnimationGroup、CAPropertyAnimation、CATransition;而CAPropertyAniamtion(同为抽象类)也衍生了CABasicAnimation和CAKeyframeAnimation。
(1) CAMediaTiming 协议,提供了动画的持续时间,速度,和重复计数。相关属性如下:
beginTime//相对于父级对象的开始时间,默认情况为0.如果你想某个直*接加入图层的动画稍后执行,可以通过手动设置这个动画的beginTime,但需要*注意的是这个beginTime需要为 CACurrentMediaTime()+延迟的秒数*/
timeOffset//时间偏移量。你将一个动画看作一个环,timeOffset改变的其实是*动画在环内的起点,比如一个duration为5秒的动画,将timeOffset设置为2(或者*7,模5为2),那么动画的运行则是从原来的2秒开始到5秒,接着再0秒到2秒,完成*一次动画.*/
speed//设置当前对象的时间流相对于父级对象时间流的流逝速度。speed有叠*加的效果,比如一个speed为2的layer其所有的父辈的speed都是1,它有一个**subLayer,speed也为2,那么一个8秒的动画在这个运行于这个subLayer只需2秒(8 / (2 * 2)).*/
fillMode//决定当前对象过了非active时间段的行为. 比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.
/*kCAFillModeRemoved 是fillMode的默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
/*kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
/* kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.
/ *kCAFillModeBoth就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.*////
举例:
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layerconvertTime:CACurrentMediaTime()fromLayer:nil];
layer.speed =0.0;
layer.timeOffset =pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed =1.0;
layer.timeOffset =0.0;
layer.beginTime =0.0;
CFTimeInterval timeSincePause = [layerconvertTime:CACurrentMediaTime()fromLayer:nil]- pausedTime;
layer.beginTime =timeSincePause;
}
(2) CAAnimation 也实现了 CAAction 协议。该协议为图层触发一个动画动作提供了提供标准化响应。
(3) CAAnimationGroup允许将一组动画放在一个数组里面,然后同时执行。
(4) CAPropertyAnimation支持层在动画期间,为层指定一个关键路径。包含CABasicAnimation和CAKeyframeAnimation。
(5) CATransition提供了影响整个层内容过渡的效果,在动画期间它使层产生fade(渐变),push(推拉)以及reveals(揭示)的动画效果。此动画可以用自己提供的自定义 core image filters(核心绘图过滤器)去扩展。相关属性如下:
type//可设置四种类型。
/*kCATransitionFade // 淡出
/*kCATransitionMoveIn //覆盖原图
/*kCATransitionPush // 推出
/*kCATransitionReveal //底部显出来
subtype//可设置四种类型。
/*kCATransitionFromRight;
/*kCATransitionFromLeft(默认值)
/*kCATransitionFromTop;
/*kCATransitionFromBottom
****可以使用setType与setSubtype组合进行动画设置,也可以只使用setType方法[animation setType:@"suckEffect"]; suckEffect就是效果名称,可以用的效果主要有:
/*pageCurl 向上翻一页
/*pageUnCurl 向下翻一页
/*rippleEffect 滴水效果
/*suckEffect 收缩效果,如一块布被抽走
/*cube 立方体效果
/*oglFlip 上下翻转效果
(6) CABasicAnimation简单的为图层的属性提供修改。
相关属性如下:
fromValue//设置动画起点
toValue//设置动画终点
byValue//设置插值。插值计算的结果由timingFunction指定,默认timingFunction为nil,会使用liner的,也就是变化是均匀的.*///
/*timingFunction是CAMediaTimingFunction类型决定了动画运行的节奏。它提供了两种获得时间函数的方式,一种是使用预定义的五种时间函数,一种是通过给点两个控制点得到一个时间函数. 相关的方法为
*+(id)functionWithName:(NSString *)name;
*+(id)functionWithControlPoints:(float)c1x:(float)c1y :(float)c2x :(float)c2y;
*-(id)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
/**五种预定义的时间函数名字的常量变量分别为
*kCAMediaTimingFunctionLinear//匀速
*kCAMediaTimingFunctionEaseIn//加速
*kCAMediaTimingFunctionEaseOut//减速
*kCAMediaTimingFunctionEaseInEaseOut,//先加后减
*kCAMediaTimingFunctionDefault//三次贝赛尔曲线*//
(7) CAKeyframeAnimation提供了关键帧动画的支持。可以支持任意多个关键帧,关键帧有两种方式来指定,使用path或者使用values,path是一个CGPathRef的值,且path只能对CALayer的 anchorPoint 和 position 属性起作用,且设置了path之后values就不再起效了。相关属性如下:
keyTimes//这个可选参数可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的.
timingFunctions//关键帧之间的过渡设置。如果values有n个元素,那么timingFunctions则应该有n-1个.
calculationMode//计算模式。其主要针对的是每一帧的内容为一个座标点的情况,也就是对anchorPoint 和 position 进行的动画.
/*目前提供如下几种模式
/*kCAAnimationLinear//默认值,表示当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算;
/*kCAAnimationDiscrete//离散的,就是不进行插值计算,所有关键帧直接逐个进行显示;
/* kCAAnimationPaced//使得动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效;
/* kCAAnimationCubic //系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的.
/* kCAAnimationCubicPaced//对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算
/*对于曲线的形状还可以通过tensionValues,continuityValues,biasValues来进行调整自定义,主要目的是使得运行的轨迹变得圆滑;*////
(8) CATransactions——事务类,事务的作用是为了保证多个animatable属性的变化同时进行,不管是同一个layer还是不同的layer之间的.是核心动画类,负责成批的把多个图层树的修改作为一个原子更新到渲染树,可以对多个layer的属性同时进行修改.它分隐式事务,和显式事务.
1. 显式事务
通过明确的调用begin,commit来提交动画,[CATransaction begin];和[CATransaction commit];嵌套使用时,只有当最外层的事务commit了之后,整个动画才开始。
2.隐式事务
除显式事务外,任何对于CALayer属性的修改,都是隐式事务.这样的事务会在run-loop中被提交.
相关方法属性如下:
begin//为当前线程开始一个新事务。
commit//提交当前事务中所作的所以改变。
flush//提交任何现有的隐式事务。将延迟提交,直到任何嵌套明确的交易已完成。
//****锁定和解除锁定的全局锁的方法。层方法自动获取,同时修改共享状态,但来电者可能需要锁定围绕多个操作,以确保一致性。锁是一个递归的自旋锁(即不应长时间举行)。
+ (void)lock;
+ (void)unlock;*////
completionBlock//当CATransaction的所有动画执行结束之后才会被调用。
//以下参数改变图层属性的动画时间,可重载隐式动画的时间
+ (CFTimeInterval)animationDuration;
+ (void)setAnimationDuration:(CFTimeInterval)dur;
//通过设置以下参数可临时禁用图层的action,当其值为YES时表示暂时禁用图层的行为
+ (BOOL)disableActions;
+ (void)setDisableActions:(BOOL)flag;
(9)CAConstraint—布局管理器,该类描述的关系被保存在子图层的constraints数组属性里面。每个 CAConstraint实例封装了一个两个图层在同一轴上的几何关系。同级层引用的名称,使用图层的name属性。特定的名称superlayer被使用来引用图层的父图层。每个轴上面最多只能指定两个关系。
Figure 1 布局管理器constraints属性
举例:
Figure 2 基于示例中constraints的布局
配置 layer的 constraints
// create and set a constraint layout manager fortheLayer
theLayer.layoutManager=[CAConstraintLayoutManager layoutManager];
CALayer *layerA = [CALayer layer];
layerA.name = @"layerA";
layerA.bounds = CGRectMake(0.0,0.0,100.0,25.0);
layerA.borderWidth = 2.0;
[layerA addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMidY
relativeTo:@"superlayer" attribute:kCAConstraintMidY]];
[layerA addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMidX
relativeTo:@"superlayer" attribute:kCAConstraintMidX]];
[theLayer addSublayer:layerA];
CALayer *layerB = [CALayer layer];
layerB.name = @"layerB";
layerB.borderWidth = 2.0;
[layerB addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintWidth
relativeTo:@"layerA"
attribute:kCAConstraintWidth]];
[layerB addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMidX
relativeTo:@"layerA"
attribute:kCAConstraintMidX]];
[layerB addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMaxY
relativeTo:@"layerA"
attribute:kCAConstraintMinY offset:-10.0]];
[layerB addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMinY
relativeTo:@"superlayer"
attribute:kCAConstraintMinY offset:+10.0]];
[theLayer addSublayer:layerB];
以上是代码执行过程:
1. 创建一个CAConstraintLayoutmanager实例,然后把它设置为theLayer的layoutManger的属性。
2. 创建一个CALayer(layerA)的实例,设置图层的name属性为“layerA”。
3. 设置layerA的bounds为(0.0,0.0,10.0,25.0)。
4. 创建一个CAConstraint对象,把它作为约束条件添加到layerA里面。该约束条件是把layerA的水平中心对齐它的父图层的水平中心。
5. 创建第二个CAConstraint对象,把它作为layerA的约束条件。该约束条件是把layerA的垂直中心对齐父图层的垂直中心。
6. 把layerA添加为theLayer的子图层。
7. 创建一个CALayer(layerB)的实例,设置图层的name属性为“layerB”。
8. 创建一个CAConstraint对象,给layerA添加该约束条件,该约束条件是设置layerB的宽度设置为与layerA的宽度相同。
9. 创建第二个CAConstraint对象,把该约束条件添加到layerB里面。该约束条件是设置layerB的垂直中心对齐layerA的垂直中心。
10. 创建第三个CAConstraint对象,并把它添加为layerB的约束条件。该约束条件设置layerB的顶边低于layerA底边10像素。
11. 创建第四个CAConstraint对象,把它作为约束条件添加到layerB里面。该约束条件是把layerB的底边高于父图层底边10像素。
注意: 有可能创建约束条件导致在相同的属性的循环引用。在布局是无法计算的情况下,行为结果是不可预知的。*///////
**********************************
**********************************
ios的CATransform3D-一个4*4矩阵,用于图层的旋转,缩放,偏移,歪斜和应用的透视。
可以通过以下的任何一个方法改变CATransform3D的数据结构:
ñ 使用CATransform3D函数
ñ 直接修改数据结构的成员
ñ 使用键-值编码改变键路径
CATransform3DIdentity是单位矩阵,该矩阵没有缩放、旋转、歪斜、透视。把该矩阵应用到图层上面,会把图层几何属性修改为默认值。
1.使用CATransform3D函数
表 1 CATransform3D 变换函数 :偏移、旋转和缩放
Function | Use |
CATransform3DMakeTranslation | Returns a transform that translates by ‘(tx, ty, tz)’. t’ = [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1]. |
CATransform3DTranslate | Translate ‘t’ by ‘(tx, ty, tz)’ and return the result: * t’ = translate(tx, ty, tz) * t. |
CATransform3DMakeScale | Returns a transform that scales by `(sx, sy, sz)’: * t’ = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]. |
CATransform3DScale | Scale ‘t’ by ‘(sx, sy, sz)’ and return the result: * t’ = scale(sx, sy, sz) * t. |
CATransform3DMakeRotation | Returns a transform that rotates by ‘angle’ radians about the vector ‘(x, y, z)’. If the vector has length zero the identity transform is returned. |
CATransform3DRotate | Rotate ‘t’ by ‘angle’ radians about the vector ‘(x, y, z)’ and return the result. t’ = rotation(angle, x, y, z) * t. |
2. 直接修改数据结构的成员
struct CATransform3D { CGFloat m11(x缩放), m12(y切变,对frame.y轴的影响), m13(旋转), m14(对整个frame有影响); CGFloat m21(x切变,对rame.x轴的影响), m22(y缩放, frame.height = height*m22), m23(动画效果与m22类似,但对frame没有影响,可能与x旋转角度有关,可自行验证), m24(对整个frame有影响,动画效果为朝观察者跳跃,正值朝z轴正方向,负值朝z轴负方向); CGFloat m31(旋转,无效果), m32(与角度有关,当在以下几种状况下,该值会影响动画效果: 与CATransform3DRotate一起使用时,当角度值不为0时;与CATransform3DTranslate一起使用时tz不为0时;), m33(负值效果,先顺时针旋转90度向z轴负方向运动,再逆时针旋转90度运动有远近效果), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义. 与CATransform3DTranslate等一起使用); CGFloat m41(x平移,对rame.x轴的影响), m42(y平移), m43(z平移), m44(为正值时frame. width =width/m44,frame.height = height/m44,对frame.y轴的影响); }; |
|
ps:整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若s<0,发生关于原点的对称等比变换。
3. 通过键值路径修改变换
表 4 CATransform3D key paths
Field Key Path | Description |
rotation.x | The rotation, in radians, in the x axis. |
rotation.y | The rotation, in radians, in the y axis. |
rotation.z | The rotation, in radians, in the z axis. |
rotation | The rotation, in radians, in the z axis. This is identical to setting the rotation.z field. |
scale.x | Scale factor for the x axis. |
scale.y | Scale factor for the y axis. |
scale.z | Scale factor for the z axis. |
scale | Average of all three scale factors. |
translation.x | Translate in the x axis. |
translation.y | Translate in the y axis. |
translation.z | Translate in the z axis. |
translation | Translate in the x and y axis. Value is an NSSize or CGSize. |
你不可以通过Objective-C 2.0的属性来设置结构域的值,比如下面的代码将会无法正常运行:
myLayer.transform.rotation.x=0;
替换的办法是,你必须通过使用setValue:forKeyPath:和valueForKeyPath来设置和读取相应的值,具体如下:
[myLayersetValue:[NSNumber numberWithInt:0]forKeyPath:@"transform.rotation.x"];