【问题标题】:Can I use CGAffineTransformMakeRotation to rotate a view more than 360 degrees?我可以使用 CGAffineTransformMakeRotation 将视图旋转 360 度以上吗?
【发布时间】:2009-02-12 18:52:12
【问题描述】:

我正在编写一个 iPhone 应用程序,并且我有一个图像,我想让它向外旋转。

目前我的代码如下所示(包装在 beginAnimations/commitAnimations 块中):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f);
swirl = CGAffineTransformRotate(scale, M_PI);
[player setTransform:swirl];    
[player setAlpha:0.0f];

但我发现如果我尝试将旋转角度更改为 4*M_PI,它根本不会旋转。是否可以使用 CGAffineTransformRotate 获得 720˚ 旋转,还是必须切换到其他技术?

如果我必须切换到另一种技术,您会建议使用另一个线程(或计时器)自己制作动画,还是 OpenGL 是更好的选择?

谢谢,
布莱克。

【问题讨论】:

    标签: iphone cocoa-touch core-animation core-graphics


    【解决方案1】:

    您可以将视图旋转一定数量的弧度,无论它是小于一个完整旋转还是一个完整旋转的多个倍数,而无需将旋转拆分为多个部分。例如,以下代码将每秒旋转一次视图,持续指定的秒数。您可以轻松地对其进行修改,使视图旋转一定数量的旋转,或一定数量的弧度。

    - (void) runSpinAnimationWithDuration:(CGFloat) duration;
    {
        CABasicAnimation* rotationAnimation;
        rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ];
        rotationAnimation.duration = duration;
        rotationAnimation.cumulative = YES;
        rotationAnimation.repeatCount = 1.0; 
        rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    
        [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
    }
    

    【讨论】:

    • 这行得通。感谢您发布它并在评论其他人的帖子时坚持!我正要分割我的动画!
    • 确保为 transform.rotation.z 执行此操作我在尝试使用 CATransform3DMakeRotation 进行转换时遇到问题。当我使用 make 旋转功能时,我一直遇到“云台锁”。当我如上所述使用 transform.rotation.z 时,效果很好!
    • 这很棒。但似乎“旋转”结果是“旋转/秒”。还是很有用的。我想在其他轴上旋转它的最简单方法是添加单独的动画,只需更改键路径?
    【解决方案2】:

    您可以,但您需要将动画分割成半圆旋转。我提供了一个示例来响应this question,使用重复的 CABasicAnimation 应用于视图下方的图层。正如我在那里建议的那样,将这些半旋转作为 CAKeyframeAnimation 的一部分可能是构建它的更好方法,因为动画会更平滑(在我的示例中,半旋转之间有轻微的障碍),你可以这样做在开始和结束时都有很好的加速/减速。

    【讨论】:

    • 酷。这似乎达到了我的预期,我想我也可以为其添加缩放变换,并自行将通知返回给我的班级。谢谢!
    • 说你必须将动画分割成半圆旋转是不正确的。看我的回答。
    • 如果您依赖 CATransform3D 作为动画的值,您可以这样做。我没有考虑过您的方法,使用 Core Animation 为变换结构字段提供的键路径扩展。你是对的,这可能是解决这个问题的一种更清洁的方法。
    【解决方案3】:

    标题回答:是的,CGAffineTransform 可以旋转超过 360 度就好了。
    对问题的回答:是的,但您不能对其进行动画处理,因为没有可动画处理的内容。

    记住the affine transformation is a matrix,旋转矩阵包含正弦和余弦数预计算。好像你说:

    CGFloat angle = 4.0 * M_PI;
    NSAffineTransformStruct matrix = {
        .m11 = cos(angle),
        .m12 = sin(angle),
        .m21 = -sin(angle),
        .m22 = cos(angle),
        .tx = 0.0,
        .ty = 0.0
    };
    NSAffineTransform *transform = [NSAffineTransform transform];
    [transform setTransformStruct:matrix];
    

    现在,让我们回顾一下cossin 的一些示例值:

    • cos(0π) = 1
    • sin(0π) = 0
    • cos(2π) = 1
    • sin(2π) = 0
    • cos(4π) = 1
    • sin(4π) = 0

    请记住,矩阵不包含角度——它只包含余弦和正弦。并且这些值不会从一个圆的倍数变为另一个。因此,没有任何动画。

    (请注意,Calculator.app 为 cos(xπ) 和 sin(xπ) 提供了错误的结果。试试 Grapher、calcGoogle。)

    您需要将动画分割成圆形的多个部分。 Brad Larson 建议的半圆就可以了。

    【讨论】:

    • 您不必分割动画。看我的回答。
    猜你喜欢
    • 2010-10-25
    • 2012-12-09
    • 2012-06-05
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多