文档描述:
/* 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
arebackwards',
forwards',both' and
removed'. 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);
动画过程可以简单的看成这样一个过程:
小结:假如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