Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to let a view rotate forever?

Is there a way to let a view rotate forever, with an specified speed? I need that for an indicator kind of thing. I know there is this weird Lxxxxx00ff constant (don't remember it exactly) that stands for "forever".

like image 366
openfrog Avatar asked Sep 27 '10 12:09

openfrog


2 Answers

You can use HUGE_VAL for floating value (if I remember correctly, repeatCount property for animation is a float).

To setup animation you can create CAAnimation object using +animationWithKeyPath: method:

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 3.0f;
animation.repeatCount = HUGE_VAL;
[rotView.layer addAnimation:animation forKey:@"MyAnimation"];

If I remember correctly creating this kind of rotation using just UIView animations is impossible because rotations on 360 degrees (2*M_PI radians) are optimized to no rotation at all.


Edit: Added a Swift version.

    let animation = CABasicAnimation(keyPath: "transform.rotation.z")
    animation.fromValue = NSNumber(value: 0.0)
    animation.toValue = NSNumber(value: 2*Double.pi)
    animation.duration = 3.0
    animation.repeatCount = Float.greatestFiniteMagnitude
    rotView.layer.add(animation, forKey: "MyAnimation")
like image 128
Vladimir Avatar answered Oct 16 '22 14:10

Vladimir


my solution for this is a bit hacky since it doesn't use core animation but at least it works truly forever and doesn't require you to setup multiple animation steps.

...
// runs at 25 fps
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:1.0/25
                          target:self
                          selector:@selector(rotate)
                          userInfo:nil
                          repeats:YES];
[timer fire];
...

- (void)rotate {
    static int rotation = 0;

    // assuming one whole rotation per second
    rotation += 360.0 / 25.0;
    if (rotation > 360.0) {
        rotation -= 360.0;
    }
    animatedView.transform = CGAffineTransformMakeRotation(rotation * M_PI / 180.0);
}
like image 41
csch Avatar answered Oct 16 '22 16:10

csch