區分隱式動畫和隱式事務:隱式動畫通過隱式事務實現動畫 。
區分顯式動畫和顯式事務:顯式動畫有多種實現方式,顯式事務是一種實現顯式動畫的方式。
1.隱式事務
除顯式事務外,任何對於CALayer屬性的修改,都是隱式事務.這樣的事務會在run-loop中被提交.// 初始化一個layer,添加到主視圖
layer=[CALayer layer];
layer.bounds = CGRectMake( 0, 0, 200, 200);
layer.position = CGPointMake( 160, 250);
layer.backgroundColor = [UIColor redColor].CGColor;
layer.borderColor = [UIColor blackColor].CGColor;
layer.opacity = 1.0f;
[self.view.layer addSublayer:layer];
[super viewDidLoad];
}
-(IBAction)changeLayerProperty
{
// 設置變化動畫過程是否顯示,默認為YES不顯示
[CATransaction setDisableActions:NO];
// 設置圓角
layer.cornerRadius = (layer.cornerRadius == 0.0f) ? 30.0f : 0.0f;
// 設置透明度
layer.opacity = (layer.opacity == 1.0f) ? 0.5f : 1.0f;
}
111
2. 顯式事務
通過明確的調用begin,commit來提交動畫
修改執行時間
[CATransaction begin];
//顯式事務默認開啟動畫效果,kCFBooleanTrue關閉
[CATransaction setValue:(id)kCFBooleanFalse
forKey:kCATransactionDisableActions];
//動畫執行時間
[CATransaction setValue:[NSNumber numberWithFloat:5.0f] forKey:kCATransactionAnimationDuration];
//[CATransaction setAnimationDuration:[NSNumber numberWithFloat:5.0f]];
anotherLayer.cornerRadius = (anotherLayer.cornerRadius == 0.0f) ? 30.0f : 0.0f;
layer.opacity = (layer.opacity == 1.0f) ? 0.5f : 1.0f;
[CATransaction commit];
[CATransaction begin];
[CATransaction begin];
[CATransaction setDisableActions:YES];
layer.cornerRadius = (layer.cornerRadius == 0.0f) ? 30.0f : 0.0f;
[CATransaction commit];
//上面的動畫並不會立即執行,需要等最外層的commit
[NSThread sleepForTimeInterval:10];
//顯式事務默認開啟動畫效果,kCFBooleanTrue關閉
[CATransaction setValue:(id)kCFBooleanFalse
forKey:kCATransactionDisableActions];
//動畫執行時間
[CATransaction setValue:[NSNumber numberWithFloat:10.0f] forKey:kCATransactionAnimationDuration];
//[CATransaction setAnimationDuration:[NSNumber numberWithFloat:5.0f]];
anotherLayer.cornerRadius = (anotherLayer.cornerRadius == 0.0f) ? 30.0f : 0.0f;
[CATransaction commit];