如何使用多个变换动画CATransform3D?

4
基本上,我正在围绕一个点旋转一个图层,如下所示:
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0 / -500;
transform = CATransform3DTranslate(transform, rotationPoint.x-center.x, rotationPoint.y-center.y, 0.0);
transform = CATransform3DRotate(transform, (rotationAngleFor) * M_PI / 180.0f, 0.0, 1.0, 0);
transform = CATransform3DTranslate(transform, center.x-rotationPoint.x, center.y-rotationPoint.y, 0.0);

我还创建了一个图层,将其添加到一个更大的图层中,然后对其进行变换:
[self.layer addSublayer:myLayer];
myLayer.transform = transform;

如何给它添加动画效果?

注意:将其放入 UIView 的动画块中不起作用。


UIView动画仅用于动画化视图属性。 - David Rönnqvist
@DavidRönnqvist 没错! - tipycalFlow
但是层上的CATransform3D是一个“layer”属性。视图上的变换直接在视图上设置,是CGAffineTransform。请参阅文档,了解您可以动画化的7个视图属性(frame、bounds、center、transform、alpha、backgroundColor、contentStretch)。变换是存在的,但它是“view”变换属性。 - David Rönnqvist
1
我放了那张笔记是为了防止回答建议使用UIView动画 :) - tipycalFlow
1个回答

9

编辑:正如@DuncanC指出的那样,我的描述与实际代码不符。

您可以使用添加到图层的CABasicAnimation来实现以下操作。

CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath: @"transform"];

    <here goes your definition of transform>

transformAnimation.toValue = [NSValue valueWithCATransform3D:newTransform];
transformAnimation.duration = 10;
[self.layer addAnimation:transformAnimation forKey:@"transform"];

这个动画对图层的transform属性进行连续变化,从图层原来的transform属性值变为newTransform属性值。变化需要10秒钟完成。


1
如果我没记错的话,动画将在开始和结束状态之间线性发生(沿直线移动而不像固定半径上的旋转)。我还相信你应该设置一个CAValueFunction来使它看起来像它应该的样子。如果我记得正确,你想使用一个kCAValueFunctionRotateY值函数。 - David Rönnqvist
1
@david,将图层进行平移、旋转、再平移回来的效果是创建一个绕非原点的点旋转的效果。如果您创建了这样的变换并将其应用于图层,则确实会使对象围绕某个任意点旋转。还可以通过使用键“transform.rotation.z”或“.y”或“.x”(取决于要围绕哪个轴旋转)来提交绕一个轴旋转的CABasicAnimation。动画默认使用缓入缓出的时间控制,因此OP需要添加代码以将时间控制更改为线性控制(如果需要的话)。 - Duncan C
1
@Jan,该动画将从先前的变换值动画到指定的变换值。如果先前的变换值是标识,则它将从标识开始。但是,如果先前的图层变换不是标识变换,则上面的代码将从该起始变换动画到指定的结束变换。 - Duncan C
这个答案解决了我的问题,当我尝试对多个变换进行动画处理时。谢谢。 - zumzum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接