用于CATransform3D动画的CAKeyframeAnimation上的平滑动画

时间:2012-07-20 21:09:45

标签: objective-c ios core-animation catransform3d

我在视图之间创建了自己的过渡动画。我为两个属性(位置和变换)设置动画,以在视图之间提供类似于立方体的过渡。框架使用CABasicAnimation,而变换使用“2阶段”CAKeyframeAnimation。一切都很好,除了一个我似乎无法弄清楚的小细节。在我的过渡期间,我在中间关键帧上应用CATransform3DScale以创建放大/缩小效果。除了动画看起来有些生涩之外,它的工作正常。它以线性方式动画关键帧之间的动画,我想让它平滑。现在CAKeyframeAnimation可以使用calculationMode来实现这一点,但它似乎不适用于转换。我已尝试将其设置为kCAAnimationCubickCAAnimationCubicPaced,但效果不佳。

以下是为一个视图的变换设置动画的代码(类似的代码块为另一个视图设置动画):

    CAKeyframeAnimation *aTransform = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    CATransform3D transform1 = RotateOnX(toView, M_PI_4);
    transform1 = CATransform3DScale(transform1, RotationalZoom, RotationalZoom, RotationalZoom);
    [aTransform setValues:Array([NSValue valueWithCATransform3D:RotateOnX(toView, M_PI_2)],
                                [NSValue valueWithCATransform3D:transform1],
                                [NSValue valueWithCATransform3D:RotateOnX(toView, 0)])];
    [toView.layer addAnimation:aTransform forKey:@"transform"];

注意:RotateOnX(UIView *, CGFloat)是一个块,它返回在X上旋转所需弧度的视图的变换。

如您所见,我只在中间关键帧上设置缩放变换。此外,视图的旋转非常平滑,只有当它改变方向时才会出现“抖动”的缩放。

有没有人对如何平滑缩放/缩放有任何想法?

1 个答案:

答案 0 :(得分:3)

尝试timingFunctions属性。由于您有3个关键帧,因此需要2个计时功能:一个用于从关键帧0到关键帧1的动画,另一个用于从关键帧1到关键帧2的动画。

aTransform.timingFunctions = [NSArray arrayWithObjects:
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInOut],
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInOut],
    nil];