How to let a view rotate forever?

前端 未结 3 1262
执念已碎
执念已碎 2021-01-13 06:49

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 reme

相关标签:
3条回答
  • 2021-01-13 07:34

    my bet is:

    -(void)animationDidStopSelector:... {
      [UIView beginAnimations:nil context:NULL];
      // you can change next 2 settings to setAnimationRepeatCount and set it to CGFLOAT_MAX
      [UIView setAnimationDelegate:self];
      [UIView setAnimationDidStopSelector:@selector(animationDidStopSelector:...)];
      [UIView setAnimationDuration:...
    
      [view setTransform: CGAffineTransformRotate(CGAffineTransformIdentity, 6.28318531)];
    
      [UIView commitAnimations];
    }
    
    //start rotation
    [self animationDidStopSelector:...];
    

    ok better bet:

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationRepeatCount: CGFLOAT_MAX];
    [UIView setAnimationDuration:2.0f];
    
    [view setTransform: CGAffineTransformMakeRotation(6.28318531)];
    
    [UIView commitAnimations];
    
    0 讨论(0)
  • 2021-01-13 07:38

    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);
    }
    
    0 讨论(0)
  • 2021-01-13 07:55

    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")
    
    0 讨论(0)
提交回复
热议问题