CATransform3DMakeRotation动画为零(从-45到+45角度)?

时间:2012-05-25 23:17:58

标签: ios core-animation

我正在尝试使用反弹效果进行简单的水平翻转动画。

    [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationCurveEaseIn animations:^{
    front.layer.transform=CATransform3DMakeRotation(DEGREES_TO_RADIANS(90), -1.0,0.0,0.0); // flip halfway
}
completion:^(BOOL finished) { // swap view
    front.alpha=0;
    back.alpha=1;
    [UIView animateWithDuration:0.5 animations:^{ // flip remaining + bounce
        back.layer.transform = CATransform3DMakeRotation(DEGREES_TO_RADIANS(45), 1.0,0.0,0.0); // final + 45 
    }
    completion:^(BOOL finished) {
        [UIView animateWithDuration:0.25 animations:^{
            back.layer.transform = CATransform3DMakeRotation(DEGREES_TO_RADIANS(-22.5), 1.0,0.0,0.0); // bounce back
        }
        completion:^(BOOL finished) {
            [UIView animateWithDuration:0.125 animations:^{
                back.layer.transform = CATransform3DMakeRotation(0, 1.0,0.0,0.0); // final
            }];
        }];
    }];
}];

除了'反弹'之外,效果很好。 -22.5旋转过渡到0而不是回到22.5而不是继续到-22.5。

我尝试过各种各样的值,还包括一个中间嵌套块,在跳转到负数之前将跳转转换为'0'。没有帮助。旋转总是动画为正角度而不是负角度。

正如测试一样,将“最终+ 45”更改为负角度会使动画停在所需的角度。所以角度本身就可以了。

问题似乎是从零开始或从零开始进行'逆时针'旋转。小于零的值总是转换为正角度。

如果以上是实现反弹效果的正确技术,那么如何构建一个(嵌套)图层动画,通过CATransform3DMakeRotation从正(45)旋转到负角(-45)?

1 个答案:

答案 0 :(得分:2)

您正在围绕x轴旋转。如果你的变换没有透视,你会如何看待正角和负角之间的差异?没有透视,正旋转和负旋转看起来都相同(高度减小)。您可以apply perspective to your transform通过设置.m34来更改变换矩阵的第三行和第四列中的值。搜索“核心动画视角”,你会发现一个很好的解释。

我在上面运行了你的代码(在一个简单的视图上,用橙色填充)。 为了更容易地看到旋转以及正角度和负角度之间的差异,我改变它以使其围绕z轴旋转。

这是我在动画中拍摄的四个截图。正如你所看到的,负面角度是有效的,除非我误解了你想要做的事情。

0 degrees 45 degrees -25 degrees 0 degrees