簡體   English   中英

CATransaction塊的范圍

[英]The scope of a CATransaction block

我已經看到一些通過執行以下操作從其超層中刪除給定層的代碼:

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作為參數,我看不到被動畫前兩層。 但是,如果我刪除obj3只是通過調用removeFromSuperlayer前兩層一般的動畫。 看起來CATransaction塊取消了所有正在完成的動畫,甚至是那些用CAKeyframeAnimation創建的動畫。

我錯過了什么?

提前致謝。

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

此外,您不應該在該代碼中需要[CATransaction flush] Apple通常建議您出於性能原因不強制執行待處理的事務,並且您在那里設置的事務不應影響任何待處理的動畫。

我猜這個奇怪的行為仍然與你之前提出的問題有關 ,三個動畫在某種程度上相互干擾。 正如我在那里評論的那樣,這就像三個動畫被添加到一個層,而不是三個獨立的動畫。 我會檢查並確保不會發生這種情況(交叉指針等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM