我有许多需要同时修改的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];
开始/提交调用之外使用CATransaction
,我才意识到动画可能会在同时设置为动画的单独对象上受到影响。在这种情况下,我的所有动画都被禁用了。
我认为解决方案是在CATransaction
开始/提交调用中明确地包装每个更新,以本地化setDisableActions:调用该事务。即使在这样做之后,似乎动画仍然是全部或全部。听起来好像我对CATransaction的运作方式不够了解。
处理多个同时CALayer隐式动画属性更新的正确方法是什么,但只为它们的一部分设置动画?这些更新调用和图层分散在多个对象中。
答案 0 :(得分:2)
当然,您正在尝试 的工作。例如:
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.lay1.position = CGPointMake(300,300);
[CATransaction commit];
self.lay2.position = CGPointMake(300,300);
这两个图层移动到同一个地方,但其中一个是动画的,另一个不是。
您的代码不是以您想要的方式工作的事实无法在没有进一步信息的情况下进行解释。 (例如,您可能会给出一层相互矛盾的命令,从而导致动画被取消。)但您肯定是在合法的轨道上。但是,如果您觉得这太令人生畏,我建议您放弃隐式图层动画,而不是使用CABasicAnimation和朋友。