我想做一個對設備動作有反應的動畫,並且即使UI線程一時很忙,我也希望它保持平穩。動畫包括更改CALayer的貝塞爾路徑。我試過從輔助線程做到這一點,但偶爾會掛起主線程有堆棧的地方。我在做什麼完全沒有希望?下面是我在線程做:從後臺線程更改CALayer的屬性是否安全?
[CATransaction lock];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[CATransaction begin];
myLayer.path = [UIBezierPath bezierPathWithOvalInRect:theRect].CGPath;
myLayer.bounds = theBounds;
[CATransaction commit];
[CATransaction flush];
[CATransaction setValue:(id)kCFBooleanFalse
forKey:kCATransactionDisableActions];
[CATransaction unlock];
雖然你應該可以更新來自輔助線程的圖層,但我注意到了「核心動畫編程指南」中的相關細節:「形狀圖層...確實涉及渲染主線程上的形狀並緩存結果。不解釋崩潰,但它可能解釋掛起。 –