CATransaction块的范围

时间:2010-12-10 16:25:32

标签: iphone ipad animation core-animation

我已经看到一些代码通过执行以下操作从其超级层中删除给定图层:

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创建的动画。

我错过了什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

CATransaction的范围应该在[CATransaction begin][CATransaction commit]行之间。

此外,您不应该在该代码中使用[CATransaction flush]。 Apple通常建议您出于性能原因不强制执行待处理的事务,并且您在那里设置的事务不应影响任何待处理的动画。

我猜这种奇怪的行为仍然与你在previous question中提出的问题有关,其中三个动画在某种程度上相互干扰。正如我在那里评论的那样,这就像三个动画被添加到一个层,而不是三个独立的动画。我会检查并确保不会发生这种情况(交叉指针等)。