2011-02-08 47 views
5

这里是我的动画代码:CATransformLayer不支持隐式动画?

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.transformLayerCATransformLayer有两个子层,一个正面和一个背面(我创建一个“炫”的效果)。但是,这段代码只是设置了位置并且没有动画就进行了转换所以我认为可能transform不支持隐式动画,所以我把它拿出来,试着设置位置,但是没有动画(我知道position支持隐式动画)。

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

编辑:这是Mac OS X,iOS的不

+0

您是否尝试过使用显式动画? – 2011-02-11 01:18:08

回答

1

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

0

隐动画是与UIView伴生的所有图层禁用。如果您对细节感兴趣,我还有另一个问题detailed response。但简而言之,如果要在与视图关联的图层上创建动画,则需要明确执行动画(即使用-addAnimation:forKey:附加CAAnimation对象)。

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

+0

这不适用于iOS,适用于Mac OS X.我应该在我的文章中更加清楚。变换图层是视图图层的子图层(视图是图层托管视图)。 – indragie 2011-02-08 05:33:17

+0

啊哈。在那种情况下,我不知道。抱歉。 – 2011-02-08 05:41:34

0

只呈现CATransformLayer的子图层。所以我的猜测是它的transform属性永远不会被应用。你有尝试设置sublayerTransform属性吗?无论如何,这似乎就是你要做的。

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;