ios - CATransform3DMakeRotation 动画槽零(从 -45 到 +45 角)?

标签 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。

我尝试了各种值,还包括一个中间嵌套 block ,该 block 将反弹转换为“0”,然后再变为负值。没有帮助。旋转始终动画为正角度而不是负角度。

正如测试一样,将“final + 45”更改为负角确实会在所需角度停止动画。所以角度本身没问题。

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

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

最佳答案

您正在绕 x 轴旋转。如果没有透视 变换,您将如何看待正角和负角之间的区别?在没有透视的情况下,正向和反向旋转看起来是一样的(降低高度)。你可以apply perspective to your transform通过设置 .m34 更改变换矩阵第三行和第四列中的值。搜索“Core Animation perspective”,你会找到很好的解释。

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

这是我在动画制作过程中截取的四张屏幕截图。如您所见,负角有效,除非我误解了您的意图。

0 degrees 45 degrees -25 degrees 0 degrees

关于ios - CATransform3DMakeRotation 动画槽零(从 -45 到 +45 角)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762367/

相关文章:

swift - 动画期间的 CALayer 使用默认属性值而不是当前实例的属性值

ios - 在 AnimationDidStop 中检索 CAKeyframeAnimationKey 的键

iphone - 在 X 轴(水平轴)上旋转 UIView

ios - 动画绘制 CAShapeLayer 的填充

ios - 如何检测对 UICollectionView 中单元格的双击

ios - 在 UITableView 中实现 imageView 滑动,具有水平滚动和页面指示器

ios - 在一个场景中处理数千个 SKSpriteNode

ios - 如何复制和重命名/重构 ios xcode 示例项目作为我的起点?

ios - 为什么 Swift 打印 "Optional(455 bytes)"

iOS 动画 UILabel 扩展