[英]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.