【问题标题】:CATransformLayer doesn't support implicit animation?CATransformLayer 不支持隐式动画?
【发布时间】:2011-02-08 05:26:15
【问题描述】:

这是我的动画代码:

CGFloat zDistance = 850;
CGFloat scaleFactor = BACK_COVER_WIDTH / self.transformLayer.bounds.size.width;
CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0);
CATransform3D scale = CATransform3DMakeScale(scaleFactor, scaleFactor, 0.0);
CATransform3D transform = CATransform3DConcat(rotation, scale);
transform.m34 = 1.0 / -zDistance;
CGPoint location = CGPointMake(CGRectGetMidX(self.layer.frame), CGRectGetMidY(self.layer.frame));
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
self.transformLayer.transform = transform;
self.transformLayer.position = location;
[CATransaction commit];

self.transformLayer 是一个CATransformLayer,有两个子层,一个用于前面,一个用于后面(我正在创建“翻转”效果)。然而,这段代码只是设置了位置和变换,没有动画。所以我想也许transform 不支持隐式动画,所以我把它拿出来并尝试设置位置,但也没有动画(我确定position 支持隐式动画)。

是我做错了什么还是CATransformLayer 不支持隐式动画?文档没有说明它不支持它,所以我假设它支持它。

编辑:这是针对 Mac OS X,而不是 iOS

【问题讨论】:

  • 你试过使用显式动画吗?

标签: objective-c cocoa core-animation calayer catransformlayer


【解决方案1】:

我最终只使用了显式动画,但 David Duncan 的回答 here 对于遇到此问题的其他人来说似乎是朝着正确方向迈出的一步。

【讨论】:

    【解决方案2】:

    UIViews 关联的所有层都禁用隐式动画。如果您对细节感到好奇,我在另一个问题上还有更多 detailed response。但简而言之,如果您希望在与视图关联的层上显示动画,则需要明确地执行它们(即使用 -addAnimation:forKey: 附加 CAAnimation 对象)。

    编辑:原来这个问题是针对 OS X 的,而 CATransformLayer 实际上是一个子层。请忽略此答案(尽管链接的答案对 iOS 仍然有用)。

    【讨论】:

    • 这不适用于 iOS,它适用于 Mac OS X。我应该在我的帖子中更清楚地说明这一点。变换层是视图层的子层(视图是托管视图的层)。
    • 啊哈哈。在那种情况下,我不知道。对不起。
    【解决方案3】:

    仅渲染 CATransformLayer 的子层。所以我的猜测是它的transform 属性永远不会被应用。您是否尝试过设置 sublayerTransform 属性?看来这就是你想要的。

    【讨论】:

    • 根据问题,他的代码确实设置了变换,它根本没有动画。
    • 糟糕。我不知何故错过了。也许CATransformLayer 不支持对其任何属性进行动画处理?
    【解决方案4】:

    如果您添加一个图层并尝试在同一个运行循环中对其进行动画处理,则动画不会发生 - 它会立即发生。您需要将图层添加到 CATransaction 中。之后,您可以隐式或显式设置动画。例如,这应该有效:

    [CATransaction begin];
    [self.view.layer addSublayer:transformLayer];
    [CATransaction commit];
    
    // implicit animation will now occur because we're in the next run loop
    transformLayer.transform = newTransform;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多