2010-09-27 3 views
5

Gibt es eine Möglichkeit, eine Ansicht mit einer festgelegten Geschwindigkeit für immer rotieren zu lassen? Ich brauche das für ein Indikator-Ding. Ich weiß, dass es diese merkwürdige Lxxxxx00ff Konstante gibt (erinnere mich nicht genau), die für "für immer" steht.Wie lässt sich eine Ansicht für immer drehen?

Antwort

20

Sie können HUGE_VAL für Floating-Wert verwenden (wenn ich mich richtig erinnere, repeatCount-Eigenschaft für die Animation ist ein Float).

Zur Einrichtung Animation können Sie CAAnimation Objekt mit +animationWithKeyPath: Methode erstellen:

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

Wenn ich es richtig, diese Art von Rotation Speichern zu schaffen mit nur UIView Animationen ist unmöglich, weil Umdrehungen auf 360 Grad (2 * M_PI Radiant) sind optimiert auf keine Drehung.

+0

hört sich gut an! Aber wie könnte ich die Animation so einrichten, dass die Ansicht um ganze 390 Grad gedreht wird und weiterläuft? – openfrog

+0

@openfrog, Dies ist die richtige Antwort. Sie drehen die Ansicht, indem Sie die Ebene der Ansicht explizit mit einer einfachen Animation drehen. Es wird "weiter rollen", wenn Sie tun, was Vladimir vorgeschlagen hat. –

0

meine Wette ist:

-(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 bessere Wette:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationRepeatCount: CGFLOAT_MAX]; 
[UIView setAnimationDuration:2.0f]; 

[view setTransform: CGAffineTransformMakeRotation(6.28318531)]; 

[UIView commitAnimations]; 
2

meine Lösung hierfür ist ein bisschen hacky, da es nicht zum Kern Animation nicht verwendet, aber zumindest funktioniert es wirklich für immer und erfordert nicht, dass Sie mehrere Animationsschritte einrichten.

... 
// 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); 
} 
Verwandte Themen