我看到一些代碼,從它移除給定的層的範圍是superlayer通過執行以下操作:一個CATransaction塊
void RemoveImmediately(CALayer *layer) {
[CATransaction flush];
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[layer removeFromSuperlayer];
[CATransaction commit];
}
我已經寫而改變動畫給定層的位置的方法使用CAKeyframeAnimation,看起來像這樣:
- (void)animateMovingObject:(NXUIObject*)obj
fromPosition:(CGPoint)startPosition
toPosition:(CGPoint)endPosition
duration:(NSTimeInterval)duration {
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.duration = duration;
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y);
CGPathAddCurveToPoint(curvedPath, NULL,
startPosition.x, endPosition.y,
startPosition.x, endPosition.y,
endPosition.x, endPosition.y);
pathAnimation.path = curvedPath;
[obj addAnimation:pathAnimation forKey:@"pathAnimation"];
CGPathRelease(curvedPath);
}
要知道,一切都很好。現在假設我在我的應用程序中有一個「主圖層」,它有3個子圖層。我希望前兩個子層移動到另一個位置,最後一個要移除。所以,我做了以下內容:
CALayer obj1 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj1];
[self animateMovingObject:obj1
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(100.0, 100.0)
duration:2.0];
CALayer obj2 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj2];
[self animateMovingObject:obj2
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(150.0, 100.0)
duration:2.0];
CALayer obj3 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj3];
// ...
RemoveImmediately(obj3); // This removes the two previous animations too
//[obj3 removeFromSuperlayer]; // This just removes obj3, the previous animations works
需要注意的是,如果我叫RemoveImmediately()
,甚至路過obj3
作爲參數,我看不到被動畫前兩層。但是,如果僅通過調用removeFromSuperlayer
刪除obj3
,則前兩層通常會動畫。 看起來像CATransaction塊取消所有正在完成的動畫,即使那些使用CAKeyframeAnimation創建的動畫。
我錯過了什麼?
謝謝提前。
謝謝,我向我展示了完成任務的方式!問題是'沖洗'的方法。我刪除了它,現在我可以看到所有正常運行的動畫。 'obj1','obj2'和'obj3'唯一共同之處在於它們是'masterLayer'的子層,所以沒有交叉指針或任何動畫干擾另一個。通過調用'flush'方法,停止了以前的動畫(委託方法'animationDidStop:finished:'完成的參數返回了NO,表明它們是手動停止的(當'flush'方法被調用時我發生了這種情況))。 – 2010-12-10 17:15:30
儘管它有效,但我試圖理解文檔中有關flush方法的內容(http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/ occ/clm/CATransaction/flush),它仍然不清楚爲什麼它會導致我的顯式動畫「停止」。 – 2010-12-10 17:24:16
@Eduardo - 是的,我也遇到了'[CATransaction flush]'干擾動畫的問題,因爲它干擾了正常的Core Animation渲染管道。只有一次我需要它來做某件事,即便如此,我仍然找到了一種方法來重新設計我正在做的事情,最終刪除這個呼叫。 – 2010-12-10 18:11:26