0

我正在尝试做一个带有反弹效果的简单水平翻转动画。

    [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”。没有帮助。旋转始终以正角度而不是负角度进行动画处理。

就像测试一样,将“final + 45”更改为负角度确实会在所需角度停止动画。所以角度本身是可以的。

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

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

4

1 回答 1

2

您正在绕 x 轴旋转。如果没有对变换的透视,您将如何看待正角和负角之间的差异?没有透视,正旋转和负旋转看起来都是一样的(降低高度)。您可以通过设置更改变换矩阵的第三行和第四列中的值来将透视应用于变换.m34。搜索“Core Animation perspective”,你会找到一个很好的解释。

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

这是我在动画期间拍摄的四张截图。如您所见,除非我误解了您要做什么,否则负角度是有效的。

0度 45度 -25度 0度

于 2012-05-26T14:18:54.647 回答