【发布时间】:2014-04-25 15:53:03
【问题描述】:
我有许多需要同时修改的 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 begin/commit 调用之外使用[CATransaction setDisableActions:YES];,我才意识到动画可能会在设置为同时动画的单独对象上受到影响。在这种情况下,我的所有更新动画都被禁用了。
我认为,解决方案是在 CATransaction begin/commit 调用中显式包装每个更新,以本地化 setDisableActions: 调用该事务。即使在这样做之后,动画似乎仍然是全有或全无。在我看来,我对 CATransaction 的工作原理还不够了解。
处理多个同时的 CALayer 隐式动画属性更新但仅对其中的一部分进行动画处理的正确方法是什么?这些更新调用和层分散在多个对象中。
【问题讨论】:
-
如果您尝试混合和匹配隐藏在彼此之间的动画和非动画更改,那么这种方法,就好像您已经找到一样,将行不通。查看
[CALayer actionForKey:]了解禁用特定属性动画的方法。 -
如果是这种情况,您是否建议剥离所有这些 CATransaction 块并在属性更新之前使用
actionForKey:? -
您使用 actionForKey 禁用给定图层属性的所有动画。这是您在 CALayer 子类中定义的东西,而不是您调用的东西。
-
实际上,您可以以非常微妙的方式使用
actionForKey:来禁用给定图层属性的动画有时 而不是其他时候。但是,我强烈怀疑您是否需要在这里担心。您应该继续尝试找出为什么您的结果与我的答案中测试代码的结果不匹配。或者,正如我已经建议的那样,放弃隐式动画并使用显式 CABasicAnimation 类型的图层动画,由您负责。
标签: ios animation ios7 core-animation