这是我的动画代码:
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
答案 0 :(得分:1)
我最后只使用了明确的动画,但David Duncan的回答here似乎是朝着正确方向迈出的一步,对于遇到此问题的其他人来说。
答案 1 :(得分:0)
对与UIView
关联的所有图层禁用隐式动画。如果你对细节感到好奇,我还会在另一个问题上有更多detailed response。但简而言之,如果您想在与视图关联的图层上制作动画,则需要明确地执行这些动画(即使用CAAnimation
附加-addAnimation:forKey:
个对象。)
编辑:事实证明这个问题适用于OS X,而CATransformLayer实际上是一个子图层。请忽略这个答案(虽然链接的答案对iOS仍然有用)。
答案 2 :(得分:0)
仅渲染CATransformLayer
的子图层。所以我的猜测是它的transform
属性永远不会被应用。您是否尝试过设置sublayerTransform
属性?无论如何,这似乎就是你想要的。
答案 3 :(得分: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;