【问题标题】:CATransaction Animations Occurring With setDisableActions:YES使用 setDisableActions:YES 发生的 CATransaction 动画
【发布时间】: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


【解决方案1】:

当然,您正在尝试做的事情可以工作。例如:

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    self.lay1.position = CGPointMake(300,300);
    [CATransaction commit];

    self.lay2.position = CGPointMake(300,300);

这两层移动到同一个地方,但其中一个是动画的,另一个不是。

如果没有进一步的信息,就无法解释您的代码没有按您想要的方式工作的事实。 (例如,您可能给一个图层提供了相互矛盾的命令,从而导致动画被取消。)但是您绝对是在合法的轨道上。但是,如果您觉得这太令人生畏,我建议您放弃隐式图层动画,而是使用 CABasicAnimation 和朋友。

【讨论】:

  • 好的,所以当您将 CATransaction 包装在开始/提交调用中时,它们确实是分开的(来自 CATransaction 类参考:“事务嵌套在线程的当前事务中,如果有的话。”) .所以,我同时做很多事情的事实并不是问题,而是我很可能在某个地方自相矛盾。嗯……
  • 这就是我的猜测。我所做的只是证明这适用于简单的情况。 :)
  • K,所以问题出在同步动画上,而不是像您的示例中那样连续。想象一下您的示例同时发生在两个不同的对象中,一个具有禁用的操作,另一个没有。这就是我遇到麻烦的地方。我正在努力寻找一种方法来通过寻找矛盾的命令来调试它。
  • 我的示例确实同时发生在两个不同的对象中,一个具有禁用的操作,另一个没有。 lay1lay2 是两个不同的东西。我本可以将两个 position 设置包装在显式 CATransaction 块中(我确实测试过),它仍然可以按预期工作:一个动画,另一个没有。我没有看到您报告的“全有或全无”。
  • 哦,对不起,我的错 - 我的意思是两个层的属性正在由不同的对象更新,所以这些 CATransactions 将并行发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多