CATransaction 知識

CATransaction 事務類,能夠對多個layer的屬性同時進行修改.它分隱式事務,和顯式事務.

區分隱式動畫和隱式事務:隱式動畫經過隱式事務實現動畫 。oop

區分顯式動畫和顯式事務:顯式動畫有多種實現方式,顯式事務是一種實現顯式動畫的方式。 post

1.隱式事務動畫

除顯式事務外,任何對於CALayer屬性的修改,都是隱式事務.這樣的事務會在run-loop中被提交.
複製代碼
- (void)viewDidLoad {
    //初始化一個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;

}  spa

 

複製代碼

111code

2. 顯式事務blog

 

經過明確的調用begin,commit來提交動畫事務

複製代碼

 修改執行時間ci

 [CATransaction begin];it

 

//顯式事務默認開啓動畫效果,kCFBooleanTrue關閉io

[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];

複製代碼
相關文章
相關標籤/搜索