2010-12-10 68 views
0

我看到一些代碼,從它移除給定的層的範圍是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創建的動畫。

我錯過了什麼?

謝謝提前。

回答

2

CATransaction的範圍應該在[CATransaction begin][CATransaction commit]行之間。

另外,你不應該在該代碼中需要[CATransaction flush]。由於性能原因,Apple通常建議您不要強制執行掛起的交易,並且您在那裏設置的交易不應該影響任何掛起的動畫。

我猜這個奇怪的行爲仍然與你在previous question中提出的問題有關,其中三個動畫在某種程度上干擾了彼此。正如我在那裏評論的,這表現得像三個動畫被添加到一個層,而不是三個獨立的動畫。我會檢查並確保沒有發生這種情況的可能性(交叉指針等)。

+0

謝謝,我向我展示了完成任務的方式!問題是'沖洗'的方法。我刪除了它,現在我可以看到所有正常運行的動畫。 'obj1','obj2'和'obj3'唯一共同之處在於它們是'masterLayer'的子層,所以沒有交叉指針或任何動畫干擾另一個。通過調用'flush'方法,停止了以前的動畫(委託方法'animationDidStop:finished:'完成的參數返回了NO,表明它們是手動停止的(當'flush'方法被調用時我發生了這種情況))。 – 2010-12-10 17:15:30

+0

儘管它有效,但我試圖理解文檔中有關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

+0

@Eduardo - 是的,我也遇到了'[CATransaction flush]'干擾動畫的問題,因爲它干擾了正常的Core Animation渲染管道。只有一次我需要它來做某件事,即便如此,我仍然找到了一種方法來重新設計我正在做的事情,最終刪除這個呼叫。 – 2010-12-10 18:11:26