我有许多CALayer/CAShapeLayer/CATextLayer对象需要同时修改,但是只有一个子集应该是有生命的。对于那些我不想动画的层,我将更新包装在CATransaction调用中如下所示:
- (void) setPlayerName:(NSString *)playerName
{
_playerName = playerName;
[CATransaction begin];
[CATransaction setDisableActions:YES];
[self updateNameLayer]; // Layer property updates happen in here
[CATransaction commit];
// Update the screen
[self setNeedsLayout];
[self setNeedsDisplay];
}直到我在[CATransaction setDisableActions:YES]; begin/commit调用之外使用了一个CATransaction,我才意识到动画可能会在同时被设置为动画的不同对象上受到影响。在这种情况下,我对该更新的所有动画都被禁用。
我认为,解决方案是在CATransaction begin/commit调用中显式包装每个更新,以本地化对该事务的setDisableActions:调用。即使这样做了,它仍然似乎是所有的动画或一无所有。在我看来,我对CATransaction的工作方式没有足够的理解。
什么是正确的方法来处理几个同时进行的CALayer隐式动画属性更新,但只对其中一个子集进行动画化?这些更新调用和层分散在多个对象上。
发布于 2014-04-25 16:22:37
当然,你想做的事是可行的。例如:
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.lay1.position = CGPointMake(300,300);
[CATransaction commit];
self.lay2.position = CGPointMake(300,300);这两个层移动到相同的位置,但其中一个是动画的,另一个不是。
如果没有进一步的信息,您的代码不能按您想要的方式工作。(例如,您可能会发出一层相互矛盾的命令,从而导致动画被取消。)但你绝对是在合法的轨道上。但是,如果您觉得这太令人望而生畏,我建议您放弃隐式层动画,而使用CABasicAnimation和朋友。
https://stackoverflow.com/questions/23297771
复制相似问题