Core Animation學習筆記一:CATransactions


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

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

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

1.隱式事務

除顯式事務外,任何對於CALayer屬性的修改,都是隱式事務.這樣的事務會在run-loop中被提交.
- ( void)viewDidLoad {
     // 初始化一個layer,添加到主視圖
    layer=[CALayer layer];
    layer.bounds = CGRectMake( 00200200);
    layer.position = CGPointMake( 160250);
    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];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM