Force clockwise/anticlockwise rotation for a CABas

2019-03-27 02:07发布

I'm animating a pendulum which swings from 0 degrees to max 200 degrees and then back again. The problem is that if the pendulum goes over 180 degrees, it returns to 0 by the shortest route which is to continue clockwise. And I'd like it to go anticlockwise. Here's my code: ('right' is a boolean which is TRUE when the pendulum is swinging from left to right)

 - (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"];
}

Any ideas how I can make this work? It's the final piece of my swingometer puzzle which is otherwise working great :D Thanks!

Michael

4条回答
男人必须洒脱
2楼-- · 2019-03-27 02:42

To get it to go anticlockwise, just set x to a negative value (add - in front) where you want

rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(x)];
查看更多
走好不送
3楼-- · 2019-03-27 02:46

Try setting something like

rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];

Using value transform functions, animations can effect the transform property of a layer using arbitrary transforms of each component (no normalization to 360°) and concatenate in the normally when multiple animations are applied at once.

You use a value transform function that rotates from 0° to 180° around the z-axis by creating a CAValueTransform function specifying the kCAValueFunctionRotateZ and then creating an animation with a fromValue of 0, a toValue of M_PI, and set the animation’s valueTransform property to the value transform instance.

查看更多
4楼-- · 2019-03-27 02:47

I'm not sure exactly what the issue is, but if you use the animation's auto reverse feature, you can probably simplify this and cause it to rotate (swing) back and forth. This works for me:

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];
查看更多
\"骚年 ilove
5楼-- · 2019-03-27 02:52

I think you have to use this code:

[rotationAnimation.byValue = [NSNumber numberWithFloat:degreesToRadians(kMax/2))];
[rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];
查看更多
登录 后发表回答