文檔描述:
/* 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