圖層的每個改變都是事務的一部分。CATransaction是核心動畫類,它負責成批的把多個圖層樹的修改作爲一個原子更新到渲染樹。
本章介紹了核心動畫支持的兩種事務。隱式事務和顯式事務。
1.1 隱式事務
當圖層樹被沒有獲得事務的線程修改的時候將會自動創建隱式事務,當線程的運行循環(run-loop)執行下次迭代的時候將會自動提交事務。
代碼1的示例修改圖層的opacity,zPosition和position數字,依賴隱式事務來確保動畫同時一起發生。
代碼 1 隱式事務動畫
theLayer.opacity=0.0;
theLayer.zPosition=-200;
thelayer.position=CGPointMake(0.0,0.0);
重要:當在一個沒有運行循環(runloop)的線程修改圖層的屬性的時候,你必須使用顯式的事務。
1.2 顯式事務
在你修改圖層樹之前,可以通過給CATransaction類發送一個begin消息來創建一個顯式事務,修改完成之後發送comit消息。顯式事務在同時設置多個圖層的屬性的時候(例如當佈局多個圖層的時候),臨時禁用圖層的行爲,或者臨時修改動畫的時間的時候非常有用。
1.2.1 臨時禁用圖層的action
你可以在修改圖層屬性值的時候通過設置事務的kCATransactionDisableActions值爲YES來暫時禁用圖層的行爲。在事務範圍所作的任何更改也不會因此而發生的動畫。代碼2顯示了一個示例,當把aLayer從可視化圖層樹移除的時候禁用淡出動畫。
代碼 2 臨時禁用 layer的action
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
1.2.2 重載隱式動畫的時間
你可以暫時改變響應改變圖層屬性的動畫的時間,通過設置事務的kCATransactionAnimationDuration鍵的值爲新的時間。事務範圍內所產生的任何動畫都會使用該新設置的時間值而不是他們原有的值。代碼3顯示了一個示例,把動畫的發生時間改爲10秒而不是zPosition和opacity所指定的動畫的默認時間。
代碼 3 重寫動畫持續時間
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
forKey:kCATransactionAnimationDuration];
theLayer.zPosition=200.0;
theLayer.opacity=0.0;
[CATransaction commit];
即使上面的示例中顯示了begin和commit所包圍的顯式事務的時間,你也可以忽略這些而採用隱式事務來替代。
1.2.3 事務的嵌套
顯式事務可以被嵌套,允許你禁用部分動畫的行爲或者在屬性被修改的時候產生的動畫使用不同的時間。僅當最外層的事務被提交的時候,動畫纔會發生。
代碼4 中顯示了一個嵌套兩個事務的例子。最外層的事務設置隱式動畫的時間爲2秒,並設置圖層的position屬性值。內層的事務設置隱式動畫的時間爲5秒,並修改圖層的opacity和zPosition屬性值。
代碼 4 嵌套的顯式事務
[CATransaction begin]; // outer transaction
// change the animation duration to 2 seconds
[CATransaction setValue:[NSNumber numberWithFloat:2.0f]
forKey:kCATransactionAnimationDuration];
// move the layer to a new position
theLayer.position = CGPointMake(0.0,0.0);
[CATransaction begin]; // inner transaction
// change the animation duration to 5 seconds
[CATransaction setValue:[NSNumber numberWithFloat:5.0f]
forKey:kCATransactionAnimationDuration];
// change the zPosition and opacity
theLayer.zPosition=200.0;
theLayer.opacity=0.0;
[CATransaction commit]; // inner transaction
[CATransaction commit]; // outer transaction