iOS动画-CoreAnimation

二、 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类的子类包括了CAAnimationGroupCAPropertyAnimationCATransition

CAAnimationGroup允许将一组动画放在一个数组里面,然后同时执行。

   CAPropertyAnimation支持层在动画期间,为层指定一个关键路径。而CAPropertyAniamtion(同为抽象类)也衍生了CABasicAnimationCAKeyframeAnimation

UIViewanimation实现的动画本质上也是通过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"];

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值