事务

Core
Animation基于三个假如,说荧屏上的另外交事务物都得以(或然可能)做动画。动画并无需你在Core
Animation中手动展开,相反须求明显地关闭,否则她会直接留存。

当你改动CALayer的一个可做动画的属性,它并不能够及时在显示屏上体现出来。相反,它是从先前的值平滑过渡到新的值。这一切都以暗中认可的一举一动,你没有供给做额外的操作。

那看起来那太棒了,就好像不太实在,大家来用叁个demo解释一下:首先和率先章“图层树”同样创造一个天青的四方,然后增加二个按键,随机改动它的水彩。代码见清单7.1。点击开关,你会发觉图层的颜料平滑过渡到三个新值,而不是跳变(图7.1)。

清单7.1 随机改动图层颜色

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIView *layerView;
 4 @property (nonatomic, weak) IBOutlet CALayer *colorLayer;/*热心人发现这里应该改为@property (nonatomic, strong)  CALayer *colorLayer;否则运行结果不正确。
 5 */
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad
11 {
12     [super viewDidLoad];
13     //create sublayer
14     self.colorLayer = [CALayer layer];
15     self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
16     self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
17     //add it to our view
18     [self.layerView.layer addSublayer:self.colorLayer];
19 }
20 
21 - (IBAction)changeColor
22 {
23     //randomize the layer background color
24     CGFloat red = arc4random() / (CGFloat)INT_MAX;
25     CGFloat green = arc4random() / (CGFloat)INT_MAX;
26     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
27     self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;                                                                                       
28 }
29 
30 @end

图片 1

 

图7.1 增添贰个按键来决定图层颜色

这其实就是所谓的隐式卡通。之所以叫隐式是因为大家并不曾点名别的动画的品类。我们一味转移了壹性格质,然后Core
Animation来支配如何而且哪天去做动画。Core
Animaiton同样支撑显式卡通,下章详细表达。

但当您转移壹天质量,Core
Animation是怎么决断动画类型和持续时间的吗?实际上动画实行的年月取决于当前事务的设置,动画类型取决于图层行为

事情实际上是Core
Animation用来含有一名目多数属性动画集合的建制,任何用钦命专门的学业去改造能够做动画的图层属性都不会即刻产生变化,而是当事情一旦提交的时候开始用一个卡通过渡到新值。

专门的学业是通过CATransaction类来做处理,这几个类的铺排性有个别意外,不像您从它的命名预期的那么去处理三个总结的作业,而是管理了一叠你没办法访谈的业务。CATransaction没有质量只怕实例方法,并且也不可能用+alloc-init办法创造它。可是足以用+begin+commit分别来入栈可能出栈。

别的能够做动画的图层属性都会被增加到栈顶的政工,你能够因此+setAnimationDuration:措施设置当前事务的卡通时间,也许通过+animationDuration情势来获取值(暗中认可0.25秒)。

Core Animation在每个run loop周期中自行开首三遍新的业务(run
loop是iOS肩负征集用户输入,管理机械漏刻只怕网络事件同期重新绘制显示屏的事物),就算你不显式的用[CATransaction begin]早先一次职业,任何在一回run
loop生生不息中属性的变动都会被聚集起来,然后做三回0.25秒的动画片。

知道这几个之后,大家就能够轻巧修更改色动画的岁月了。大家本来能够用当下工作的+setAnimationDuration:艺术来修改换画时间,但在此地我们先是起三个新的作业,于是修改时间就不会有别的副成效。因为修改当前作业的年华或许会促成同有的时候刻别的动画(如荧屏旋转),所以最棒如故在调治动画此前压入三个新的事体。

修改后的代码见清单7.2。运营程序,你会发觉色块颜色比在此以前变得越来越慢了。

清单7.2 使用CATransaction操纵动画时间

 1 - (IBAction)changeColor
 2 {
 3     //begin a new transaction
 4     [CATransaction begin];
 5     //set the animation duration to 1 second
 6     [CATransaction setAnimationDuration:1.0];
 7     //randomize the layer background color
 8     CGFloat red = arc4random() / (CGFloat)INT_MAX;
 9     CGFloat green = arc4random() / (CGFloat)INT_MAX;
10     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
11     self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
12     //commit the transaction
13     [CATransaction commit];
14 }

 

如果你用过UIView的动画方法做过一些动画效果,那么应该对这个模式不陌生。UIView有两个方法,+beginAnimations:context:和+commitAnimations,和CATransaction的+begin和+commit方法类似。实际上在+beginAnimations:context:和+commitAnimations之间所有视图或者图层属性的改变而做的动画都是由于设置了CATransaction的原因。

在iOS4中,苹果对UIView增添了一种基于block的动画方法:+animateWithDuration:animations:。那样写对做一批的习性动画在语法上会特别简约,但真相上它们都以在做同样的政工。

CATransaction+begin+commit方法在+animateWithDuration:animations:其间自行调用,那样block中具有属性的更动都会被事务所包括。那样也能够免止开荒者由于对+begin+commit相配的失误变成的危机。

 

事务 Core
Animation基于多少个一旦,说显示器上的别的东西都得以(或然大概)做动画。动画并无需你在Core
Animati…

事务

Core
Animation基于八个例如,说荧屏上的别的东西都得以(也许也许)做动画。动画并无需你在Core
Animation中手动张开,相反要求确定地关闭,不然她会直接存在。

当您转移CALayer的贰个可做动画的品质,它并不能及时在荧屏上反映出来。相反,它是从先前的值平滑过渡到新的值。这一切都以默许的作为,你无需做额外的操作。

那看起来那太棒了,就像是不太实在,我们来用一个demo解释一下:首先和率先章“图层树”同样创制一个红棕的正方,然后增加三个开关,随机更改它的颜色。代码见清单7.1。点击按钮,你会意识图层的水彩平滑过渡到多个新值,并非跳变(图7.1)。

清单7.1 随机改造图层颜色

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIView *layerView;
 4 @property (nonatomic, weak) IBOutlet CALayer *colorLayer;/*热心人发现这里应该改为@property (nonatomic, strong)  CALayer *colorLayer;否则运行结果不正确。
 5 */
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad
11 {
12     [super viewDidLoad];
13     //create sublayer
14     self.colorLayer = [CALayer layer];
15     self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
16     self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
17     //add it to our view
18     [self.layerView.layer addSublayer:self.colorLayer];
19 }
20 
21 - (IBAction)changeColor
22 {
23     //randomize the layer background color
24     CGFloat red = arc4random() / (CGFloat)INT_MAX;
25     CGFloat green = arc4random() / (CGFloat)INT_MAX;
26     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
27     self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;                                                                                       
28 }
29 
30 @end

图片 2

 

图7.1 增加二个按键来支配图层颜色

那件事实上正是所谓的隐式动画。之所以叫隐式是因为大家并未点名别的动画的门类。大家无非转移了叁脾个性,然后Core
Animation来调节怎样况兼曾几何时去做动画。Core
Animaiton一样支撑显式动画,下章详细表明。

但当你改动三个本性,Core
Animation是何等决断动画类型和持续时间的吧?实际上动画试行的小时取决于当前事务的安装,动画类型取决于图层行为

政工实际上是Core
Animation用来含有一三种属性动画集结的机制,任何用钦赐业务去退换可以做动画的图层属性都不会霎时产生变化,而是当事情一旦提交的时候开首用三个动画片过渡到新值。

业务是透过CATransaction类来做管理,这么些类的宏图有个别不敢相信 无法相信,不像你从它的命名预期的那么去管理一个简约的专门的学问,而是处理了一叠你不可能访谈的作业。CATransaction不曾质量只怕实例方法,而且也不能用+alloc-init主意创制它。不过能够用+begin+commit分别来入栈大概出栈。

别的能够做动画的图层属性都会被加多到栈顶的事体,你能够通过+setAnimationDuration:艺术设置当前政工的卡通片时间,大概经过+animationDuration办法来获取值(暗中同意0.25秒)。

Core Animation在每个run loop周期中机动开始二次新的作业(run
loop是iOS担当募集用户输入,管理放大计时器恐怕互连网事件同不经常间重新绘制荧屏的事物),就算你不显式的用[CATransaction begin]开端贰遍专门的职业,任何在贰次run
loop循环中属性的转移都会被聚集起来,然后做三遍0.25秒的动画。

清楚那些之后,大家就能够轻便修改换色动画的时刻了。我们自然能够用当下作业的+setAnimationDuration:方法来修改换画时间,但在此地大家率先起多个新的政工,于是修改时间就不会有其余副功效。因为修改当前事务的岁月恐怕会产生同有时刻别的动画(如荧屏旋转),所以最棒大概在调度动画在此以前压入二个新的事务。

修改后的代码见清单7.2。运转程序,你会开掘色块颜色比此前变得越来越慢了。

清单7.2 使用CATransaction决定动画时间

 1 - (IBAction)changeColor
 2 {
 3     //begin a new transaction
 4     [CATransaction begin];
 5     //set the animation duration to 1 second
 6     [CATransaction setAnimationDuration:1.0];
 7     //randomize the layer background color
 8     CGFloat red = arc4random() / (CGFloat)INT_MAX;
 9     CGFloat green = arc4random() / (CGFloat)INT_MAX;
10     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
11     self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
12     //commit the transaction
13     [CATransaction commit];
14 }

 

如果你用过UIView的动画方法做过一些动画效果,那么应该对这个模式不陌生。UIView有两个方法,+beginAnimations:context:和+commitAnimations,和CATransaction的+begin和+commit方法类似。实际上在+beginAnimations:context:和+commitAnimations之间所有视图或者图层属性的改变而做的动画都是由于设置了CATransaction的原因。

在iOS4中,苹果对UIView增多了一种基于block的动画片方法:+animateWithDuration:animations:。那样写对做一堆的习性动画在语法上会尤其简便易行,但实质上它们都以在做同样的事体。

CATransaction+begin+commit方法在+animateWithDuration:animations:中间自行调用,那样block中有着属性的更动都会被事务所包含。那样也足防止止开辟者由于对+begin+commit同盟的失误导致的高风险。

 

事务

Core
Animation基于二个假若,说荧屏上的别样东西都能够(大概只怕)做动画。动画并无需你在Core
Animation中手动张开,相反须求肯定地关闭,不然他会直接存在。

当您转移CALayer的一个可做动画的性质,它并不可能及时在显示器上反映出来。相反,它是从先前的值平滑过渡到新的值。这一切都以暗许的表现,你没有须要做额外的操作。

那看起来那太棒了,就像是不太真实,大家来用一个demo解释一下:首先和第一章“图层树”一样创制贰个水海水绿的正方,然后增多二个开关,随机改变它的颜色。代码见清单7.1。点击按键,你会意识图层的水彩平滑对接到三个新值,而不是跳变(图7.1)。

清单7.1 随机改造图层颜色

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIView *layerView;
 4 @property (nonatomic, weak) IBOutlet CALayer *colorLayer;/*热心人发现这里应该改为@property (nonatomic, strong)  CALayer *colorLayer;否则运行结果不正确。
 5 */
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad
11 {
12     [super viewDidLoad];
13     //create sublayer
14     self.colorLayer = [CALayer layer];
15     self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
16     self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
17     //add it to our view
18     [self.layerView.layer addSublayer:self.colorLayer];
19 }
20 
21 - (IBAction)changeColor
22 {
23     //randomize the layer background color
24     CGFloat red = arc4random() / (CGFloat)INT_MAX;
25     CGFloat green = arc4random() / (CGFloat)INT_MAX;
26     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
27     self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;                                                                                       
28 }
29 
30 @end

图片 2

 

图7.1 加多三个按键来支配图层颜色

那其实正是所谓的隐式动画。之所以叫隐式是因为我们并未点名其余动画的体系。大家一味改动了三个属性,然后Core
Animation来调节哪些並且什么时候去做动画。Core
Animaiton一样援助显式动画,下章详细表达。

但当您退换叁个属性,Core
Animation是怎么样判断动画类型和持续时间的啊?实际上动画实践的岁月取决于当前事务的装置,动画类型取决于图层行为

事务实际上是Core
Animation用来含有一密密麻麻属性动画集结的体制,任何用内定业务去改换能够做动画的图层属性都不会即时发生变化,而是当职业一旦提交的时候起始用叁个动画片过渡到新值。

政工是因此CATransaction类来做管理,那些类的安顿有个别意外,不像你从它的命名预期的那么去管理二个简便的业务,而是管理了一叠你无法访谈的事务。CATransaction不曾性能大概实例方法,并且也不可能用+alloc-init方法创制它。可是足以用+begin+commit各自来入栈或许出栈。

别的能够做动画的图层属性都会被增加到栈顶的职业,你可以透过+setAnimationDuration:主意设置当前事务的卡通时间,可能经过+animationDuration方式来获取值(暗中同意0.25秒)。

Core Animation在每个run loop周期中自行开始壹遍新的事务(run
loop是iOS担当搜聚用户输入,管理定时器可能互连网事件同不经常间重新绘制显示器的事物),尽管你不显式的用[CATransaction begin]开始一遍工作,任何在一遍run
loop巡回中属性的变动都会被集中起来,然后做三次0.25秒的动画片。

精通那么些之后,大家就可以轻便修改换色动画的时间了。我们本来能够用当下专业的+setAnimationDuration:艺术来修改变画时间,但在这里大家首先起多少个新的业务,于是修改时间就不会有其他副成效。因为修改当前作业的岁月可能会促成同不经常刻其余动画(如荧屏旋转),所以最棒照旧在调动动画在此以前压入叁个新的思想政治工作。

修改后的代码见清单7.2。运维程序,你会发觉色块颜色比在此以前变得越来越慢了。

清单7.2 使用CATransaction支配动画时间

 1 - (IBAction)changeColor
 2 {
 3     //begin a new transaction
 4     [CATransaction begin];
 5     //set the animation duration to 1 second
 6     [CATransaction setAnimationDuration:1.0];
 7     //randomize the layer background color
 8     CGFloat red = arc4random() / (CGFloat)INT_MAX;
 9     CGFloat green = arc4random() / (CGFloat)INT_MAX;
10     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
11     self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
12     //commit the transaction
13     [CATransaction commit];
14 }

 

如果你用过UIView的动画方法做过一些动画效果,那么应该对这个模式不陌生。UIView有两个方法,+beginAnimations:context:和+commitAnimations,和CATransaction的+begin和+commit方法类似。实际上在+beginAnimations:context:和+commitAnimations之间所有视图或者图层属性的改变而做的动画都是由于设置了CATransaction的原因。

在iOS4中,苹果对UIView增多了一种基于block的卡通片方法:+animateWithDuration:animations:。那样写对做一批的性质动画在语法上会特别简便易行,但实质上它们都以在做一样的业务。

CATransaction+begin+commit方法在+animateWithDuration:animations:内部自行调用,那样block中兼有属性的退换都会被事务所包罗。那样也足以幸免开荒者由于对+begin+commit十三分的失误形成的高风险。

 

事务

Core
Animation基于多少个若是,说显示器上的其他交事务物都得以(或然或者)做动画。你并无需在Core
Animation中手动打开动画,不过你须要分明地关闭它,不然它会平素留存。

当你退换CALayer贰个可做动画的性质时,这么些退换并不会立刻在荧屏上反映出来。相反,该属性会从在此以前的值平滑过渡到新的值。这一切都是暗中同意的一坐一起,你没有需求做额外的操作。

那看起来那太棒了,就好像不太实在,大家用多个demo来解释一下:首先和率先章“图层树”同样创制多少个海洋蓝的四方,然后增多三个开关,随机改换它的水彩。代码见清单7.1。点击按键,你会发觉图层的颜料平滑过渡到三个新值,并非跳变(图7.1)。

清单7.1 随机改换图层颜色

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIView *layerView;
@property (nonatomic, strong) CALayer *colorLayer;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //create sublayer
    self.colorLayer = [CALayer layer];
    self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
    self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
    //add it to our view
    [self.layerView.layer addSublayer:self.colorLayer];
}

- (IBAction)changeColor
{
    //randomize the layer background color
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;                                                                                       
}

@end

图片 4

图 7.1

图7.1 加多三个开关来决定图层颜色

那实质上正是所谓的隐式动画片。之所以叫隐式是因为我们并不曾点名别的动画的品类。我们只是转移了贰天品质,然后Core
Animation来支配如並且兼曾几何时去做动画。Core
Animaiton一样支撑显式动画片,下章详细表达。

但当你转移六特性能,Core
Animation是怎么剖断动画类型和持续时间的吗?实际上动画实施的小时取决于当前事务的设置,动画类型取决于图层行为

事务实际上是Core
Animation用来含有一文山会海属性动画集结的建制,任何用钦定业务去更换能够做动画的图层属性都不会即时爆发变化,而是当事情一旦提交的时候起首用贰个卡通过渡到新值。

职业是通过CATransaction类来做管理,这几个类的设计有个别意外,不像您从它的命名预期的那么去管理三个简练的政工,而是管理了一叠你不能访谈的职业。CATransaction从不品质也许实例方法,并且也无法用+alloc-init方法创立它。而是用类方法+begin+commit个别来入栈只怕出栈。

任何能够做动画的图层属性都会被增添到栈顶的事情,你能够因而+setAnimationDuration:措施设置当前事务的卡通时间,恐怕通过+animationDuration方法来赢得时间长度值(暗中认可0.25秒)。

Core Animation在每个run loop周期中自动早先贰遍新的工作(run
loop是iOS担负搜罗用户输入,管理未成功的停车计时器大概网络事件,最后重新绘制显示器的东西),纵然你不显式地使用[CATransaction begin]开班叁遍专门的学问,在一个特定run
loop循环中的任何性质的变型都会被访谈起来,然后做一回0.25秒的动画。

清楚那些之后,大家就能够轻巧修更换色动画的日子了。大家自然能够用当下业务的+setAnimationDuration:方法来修更改画时间,但在那边大家率先起贰个新的职业,于是修改时间就不会有其他副效用。因为修改当前事务的时间恐怕会变成同有的时候刻别的动画(如显示器旋转),所以最佳照旧在调治动画从前压入二个新的事体。

修改后的代码见清单7.2。运营程序,你会发掘色块颜色比在此之前变得越来越慢了。

清单7.2 使用CATransaction决定动画时间

- (IBAction)changeColor
{
    //begin a new transaction
    [CATransaction begin];
    //set the animation duration to 1 second
    [CATransaction setAnimationDuration:1.0];
    //randomize the layer background color
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
    //commit the transaction
    [CATransaction commit];
}

即使您用过UIView的卡通方法做过一些动画效果,那么应该对那一个形式不生分。UIView有四个措施,+beginAnimations:context:+commitAnimations,和CATransaction+begin+commit艺术类似。实际上在+beginAnimations:context:+commitAnimations时期具备视图可能图层属性的改动而做的动画都以由于设置了CATransaction的原因。

在iOS4中,苹果对UIView增多了一种基于block的卡通方法:+animateWithDuration:animations:。那样写对做一群的属性动画在语法上会尤其简明,但本质上它们都以在做同样的政工。

CATransaction+begin+commit方法在+animateWithDuration:animations:其间自行调用,那样block中全体属性的更改都会被事务所包括。那样也可避防止开荒者由于对+begin+commit匹配的失误导致的高危机。

业务(隐式动画),事务动画

图层行为

现行反革命来做个实验,试着间接对UIView关联的图层做动画而不是贰个单独的图层。清单7.4是对清单7.2代码的少数修改,移除了colorLayer,而且直接设置layerView涉及图层的背景观。

清单7.4 直接设置图层的性能

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIView *layerView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //set the color of our layerView backing layer directly
    self.layerView.layer.backgroundColor = [UIColor blueColor].CGColor;
}

- (IBAction)changeColor
{
    //begin a new transaction
    [CATransaction begin];
    //set the animation duration to 1 second
    [CATransaction setAnimationDuration:1.0];
    //randomize the layer background color
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.layerView.layer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
    //commit the transaction
    [CATransaction commit];
}

运转程序,你会意识当按下按键,图层颜色弹指间切换来新的值,并不是前边平滑对接的动画片。发生了怎么样吗?隐式动画好像被UIView波及图层给禁止使用了。

试想一下,假设UIView的属性都有动画天性的话,那么不论是在曾几何时修改它,我们都应有能只顾到的。所以,要是说UIKit创立在Core
Animation(暗中同意对具有东西都做动画)之上,那么隐式动画是什么样被UIKit禁止使用掉呢?

大家了然Core
Animation平常对CALayer的装有属性(可动画的属性)做动画,可是UIView把它事关的图层的那几个特点关闭了。为了更加好注解那或多或少,大家须求精晓隐式动画是怎么落到实处的。

我们把改换属性时CALayer电动应用的卡通称作行为,当CALayer的品质被涂改时候,它会调用-actionForKey:办法,传递属性的名目。剩下的操作都在CALayer的头文件中有详尽的辨证,实质上是之类几步:

  • 图层首先检查评定它是还是不是有嘱托,并且是还是不是落到实处CALayerDelegate商量钦命的-actionForLayer:forKey方法。若是有,间接调用并重临结果。
  • 只要未有嘱托,也许委托未有落成-actionForLayer:forKey格局,图层接着检查包蕴属性名称对应行为映射的actions字典。
  • 如果actions字典从不满含相应的天性,那么图层接着在它的style字典接着寻觅属性名。
  • 最后,如果在style其间也找不到相应的行事,那么图层将会一直调用定义了各个属性的行业内部作为的-defaultActionForKey:方法。

由此一轮完整的搜寻截至之后,-actionForKey:抑或再次回到空(这种情况下将不会有动画发生),要么是CAAction共谋对应的对象,最后CALayer拿这么些结果去对原先和最近的值做动画。

于是乎那就表达了UI基特是怎么样禁止使用隐式动画的:每一个UIView对它涉及的图层都扮演了三个委托,并且提供了-actionForLayer:forKey的完成形式。当不在一个动画片块的兑现中,UIView对具备图层行为再次回到nil,可是在动画block范围以内,它就再次回到了四个非空值。我们能够用一个demo做个简易的实践(清单7.5)

清单7.5 测试UIView的actionForLayer:forKey:实现

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIView *layerView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //test layer action when outside of animation block
    NSLog(@"Outside: %@", [self.layerView actionForLayer:self.layerView.layer forKey:@"backgroundColor"]);
    //begin animation block
    [UIView beginAnimations:nil context:nil];
    //test layer action when inside of animation block
    NSLog(@"Inside: %@", [self.layerView actionForLayer:self.layerView.layer forKey:@"backgroundColor"]);
    //end animation block
    [UIView commitAnimations];
}

@end

运转程序,控制台显示结果如下:

$ LayerTest[21215:c07] Outside: <null>
$ LayerTest[21215:c07] Inside: <CABasicAnimation: 0x757f090>

所以跟预见的一样,当属性在动画块之外爆发变动,UIView一直通过再次回到nil来剥夺隐式动画。但假使在动画块范围以内,依据动画具体项目再次回到相应的质量,在那些例子正是CABasicAnimation(第八章“显式动画”将会涉及)。

自然重返nil并不是禁止使用隐式动画独一的主意,CATransaction有个措施叫做+setDisableActions:,能够用来对具有属性张开或许关闭隐式动画。就算在清单7.2的[CATransaction begin]自此加多下边包车型客车代码,同样也会阻拦动画的发生:

[CATransaction setDisableActions:YES];

小结一下,大家清楚了之类几点

  • UIView关系的图层禁用了隐式动画,对这种图层做动画的天下无双办法就是运用UIView的卡通函数(而不是借助CATransaction),恐怕接续UIView,并覆盖-actionForLayer:forKey:办法,也许直接创制二个显式动画(具体细节见第八章)。
  • 对此单身存在的图层,我们得以透过完毕图层的-actionForLayer:forKey:信托方法,只怕提供三个actions字典来决定隐式动画。

我们来对颜色渐变的事例使用一个两样的作为,通过给colorLayer设置三个自定义的actions字典修改清单7.1。大家也能够利用委托来完结,不过actions字典能够写越来越少的代码。那么到底改什么创制七个适当的一言一动指标呢?

行为平日是贰个被Core
Animation隐式调用的显式动画片对象。这里我们接纳的是一个达成了CATransition的实例,叫做推进过渡(参考清单7.6)。

第八章旅长会详细分解过渡,可是对于当今,知道CATransition响应CAAction说道,並且能够用作一个图层行为就足够了。结果很赞,不论在什么样时候改造背景颜色,新的色块都以从左侧滑入,并非暗中同意的渐变效果。(参谋图7.3)

清单7.6 实现自定义行为

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIView *layerView;
@property (nonatomic, strong) CALayer *colorLayer;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //create sublayer
    self.colorLayer = [CALayer layer];
    self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
    self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
    //add a custom action
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromLeft;
    self.colorLayer.actions = @{@"backgroundColor": transition};
    //add it to our view
    [self.layerView.layer addSublayer:self.colorLayer];
}

- (IBAction)changeColor
{
    //randomize the layer background color
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
}

@end

图片 5

图7.3 使用推进过渡的色值动画

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注