我已经看到一些代码通过执行以下操作从其超级层中删除给定图层:
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创建的动画。
我错过了什么?
提前致谢。
答案 0 :(得分:2)
CATransaction的范围应该在[CATransaction begin]
和[CATransaction commit]
行之间。
此外,您不应该在该代码中使用[CATransaction flush]
。 Apple通常建议您出于性能原因不强制执行待处理的事务,并且您在那里设置的事务不应影响任何待处理的动画。
我猜这种奇怪的行为仍然与你在previous question中提出的问题有关,其中三个动画在某种程度上相互干扰。正如我在那里评论的那样,这就像三个动画被添加到一个层,而不是三个独立的动画。我会检查并确保不会发生这种情况(交叉指针等)。