UIImageView 的 CABasicAnimation 强制顺时针/逆时针旋转?

8
我正在制作一个摆锤动画,它从0度摆到最大200度,然后再回来。问题是,如果摆锤超过了180度,它会通过继续顺时针方向返回到0度。而我希望它逆时针旋转。以下是我的代码: ('right' 是一个布尔值,当摆锤从左到右摆动时为TRUE)
 - (void)swingPendulum {
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    if (right) 
        rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMax)];
    else
        rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];                               
    rotationAnimation.duration = 1.0;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.delegate = self;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    rotationAnimation.removedOnCompletion = NO;

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

有什么办法可以让这个工作?它是我摆动计谋的最后一块拼图,除此之外一切都运作良好:D 谢谢! 迈克尔
4个回答

8
要使其逆时针旋转,只需将x设为负值(在前面加上“-”),然后放置在您想要的位置。
rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(x)];

谢谢您的回答,但恐怕它似乎没有什么区别。将其设置为负值似乎只会使动画在最后突然停止...我想也许我需要重新编写它,使用NSTimer逐帧动画... - Smikey
实际上,你是对的 - 因为kMin目前设置为-20,所以这确实使得摆锤逆时针摆动,但只有在它没有超过180度的情况下。如果它超过了180度,那么无论我将其设置为什么值(-180、-90、90等),它总是继续顺时针旋转,即使这不是最短的路径...还有其他想法吗? - Smikey
2
啊啊啊,如果我将它设置为-380这样的值,它就可以工作了。我不太确定为什么,但我刚刚添加了一个条件,根据初始摆动是否超过180度来切换toValue。感谢所有的帮助! - Smikey

2

尝试设置类似于以下内容:

rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];

使用值变换函数,动画可以使用每个组件的任意变换(不规范化为360°)来影响图层的变换属性,并在同时应用多个动画时正常连接。
您可以使用值变换函数创建一个从0°到180°绕z轴旋转的CAValueTransform函数,然后创建一个动画,将fromValue设置为0,toValue设置为M_PI,并将动画的valueTransform属性设置为该值变换实例。

谢谢。我有点不愿意改变我已经使用的方法,除非没有办法修复它,因为我有很多其他依赖于我已经使用的方法的代码。如上所述,我实际上正在创建一个高尔夫游戏风格的挥杆计时器,而不是一个摆锤,因此在任何时候用户都可以打断向上摆动(以确定力量),然后它会摆回来,所以用户可以再次打断(以确定准确性)。我拥有所有这些功能,除了一个问题,如果用户让杆超过180度,它不会摆回来,而是向前摆动。 - Smikey
尝试设置并查看是否有效?我有这样的印象,它应该有效。 - tc.
我做了一些更改 - 它开始表现得相当奇怪... 我会再试试看并回来! - Smikey

1

我认为你需要使用这段代码:

[rotationAnimation.byValue = [NSNumber numberWithFloat:degreesToRadians(kMax/2))];
[rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];

0
我不确定问题具体是什么,但如果你使用动画的自动反转功能,你可以简化这个问题并使其来回旋转(摇摆)。这对我来说很有效:
CABasicAnimation* rotationAnimation = 
          [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
[rotationAnimation setToValue:[NSNumber numberWithFloat:DegreesToRadians(200.0)]];
[rotationAnimation setDuration:1.0];
[rotationAnimation setRepeatCount:HUGE_VALF]; // Repeat forever
[rotationAnimation setAutoreverses:YES]; // Return to starting point

[[pendulum layer] addAnimation:rotationAnimation forKey:nil];

一个好主意,但反摆不是正摆的完全相反。即正摆从0开始,而反摆则向后摆至-20。因此,我更愿意调用一个函数,将其从当前变换摆回到特定角度。我并不是要制作一个完美的摆锤,而是一个高尔夫游戏风格的挥杆计时器——玩家在上升过程中停止它以获得力量,在下降过程中再次停止以获得准确性。它的工作非常完美,除非杆在上升过程中超过180度,此后它将继续逆时针转到0,而不是反向。所以我需要想办法强制它。 - Smikey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接