5

这是我的动画代码:

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

4

4 回答 4

1

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

于 2011-03-18T20:45:29.983 回答
0

UIView与s关联的所有层都禁用隐式动画。如果您对细节感到好奇,我对另一个问题有更详细的答复。但简而言之,如果您想要在与视图关联的层上制作动画,您需要明确地执行它们(即CAAnimation使用 附加对象-addAnimation:forKey:)。

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

于 2011-02-08T05:30:59.143 回答
0

CATransformLayer渲染 a 的子层。所以我的猜测是它的transform属性永远不会被应用。您是否尝试过设置sublayerTransform属性?无论如何,这似乎就是你想要的。

于 2011-02-12T19:08:41.270 回答
0

如果您添加一个图层并尝试在同一个运行循环中对其进行动画处理,则动画不会发生 - 它会立即发生。您需要将图层添加到 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;
于 2013-02-14T19:36:50.237 回答