fillMode(CAMediaTiming)

文档描述:

/* Defines how the timed object behaves outside its active duration.
Local time may be clamped to either end of the active duration, or
the element may be removed from the presentation. The legal values
are backwards',forwards', both' andremoved'. Defaults to
`removed'. */

@property(copy) NSString *fillMode;

/* `fillMode' options. */
CA_EXTERN NSString * const kCAFillModeForwards
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAFillModeBackwards
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAFillModeBoth
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
CA_EXTERN NSString * const kCAFillModeRemoved
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);

动画过程可以简单的看成这样一个过程:

屏幕快照 2017-08-14 下午2.56.45.png

小结:假如fillMode和CABasicAnimation结合使用可以理解成
kCAFillModeForwards对应toValue:动画结束后,图层保持toValue状态
kCAFillModeBackwards对应fromValue:动画前,图层一直保持fromValue状态
kCAFillModeBoth对应fromValue和toValue:以上两者的结合
kCAFillModeRemoved:对图层没有什么影响,动画结束后图层恢复原来的状态

对于beginTime非0的一段动画来说,会出现一个当动画添加到图层上但什么也没发生的状态。类似的,removeOnCompletion被设置为NO的动画将会在动画结束的时候仍然保持之前的状态。这就产生了一个问题,当动画开始之前和动画结束之后,被设置动画的属性将会是什么值呢?
一种可能是属性和动画没被添加之前保持一致,也就是在模型图层定义的值(见第七章“隐式动画”,模型图层和呈现图层的解释)。
另一种可能是保持动画开始之前那一帧,或者动画结束之后的那一帧。这就是所谓的填充,因为动画开始和结束的值用来填充开始之前和结束之后的时间。
这种行为就交给开发者了,它可以被CAMediaTiming的fillMode来控制。fillMode是一个NSString类型,可以接受如下四种常量:
kCAFillModeForwards
kCAFillModeBackwards
kCAFillModeBoth
kCAFillModeRemoved
默认是kCAFillModeRemoved,当动画不再播放的时候就显示图层模型指定的值剩下的三种类型向前,向后或者即向前又向后去填充动画状态,使得动画在开始前或者结束后仍然保持开始和结束那一刻的值。
《ios核心动画高级技巧》CAMediaTiming

测试代码:

    self.view.backgroundColor = [UIColor whiteColor];
    CALayer *colorLayer = [[ CALayer alloc] init];
    colorLayer.position = self.view.center;
    colorLayer.backgroundColor = [UIColor redColor].CGColor;
    colorLayer.bounds = CGRectMake(0.0f, 0.0f, 20.0f, 20.0f);
    [self.view.layer addSublayer:colorLayer];
    
    CABasicAnimation *boundAn = [CABasicAnimation animationWithKeyPath:@"bounds"];
    boundAn.fromValue = [NSValue valueWithCGRect:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
    boundAn.toValue = [NSValue valueWithCGRect:CGRectMake(0.0f, 0.0f, 200.0f, 200.0f)];
    boundAn.beginTime = 2.0f;
    boundAn.duration = 5.0f;
    boundAn.fillMode = self.fillMode;
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations = [NSArray arrayWithObject:boundAn];
    group.duration = 10.0f;
    [colorLayer addAnimation:group forKey:nil];

附录demo

推荐阅读更多精彩内容

  • Core Animation 1.核心动画,是一组非常强大的动画处理api,动画执行过程在后台,不会阻塞主线程,直...
    Cat_uncle阅读 229评论 0 0
  • 引言 之前说到CALayer以及子类动画,并且CALayer的有些属性自带隐式动画,不明白的可自行查看之前的文章,...
    MrHippo阅读 6,885评论 9 147
  • Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立...
    戴尼玛阅读 716评论 2 17
  • CAAnimation CAAnimation 是一个抽像类。CAAnimation 也派生出了很多子类,我们使用...
    谢谢生活阅读 467评论 0 8
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 3,721评论 4 21