2009-02-05 10 views
16

Ich versuche, einige UIView um seinen Mittelpunkt zu drehen, so dass der einfache Code so etwas wie (in Pseudo-Code) geht:drehen, um eine UIView um seinen Mittelpunkt, sondern mehrmals

[UIView beginAnimations:@"crazyRotate" context:nil]; 
[UIView setAnimationDuration:1.0]; 
someview.transform = CGAffineTransformMakeRotation(angle); 
[UIView commitAnimations] 

jetzt, wenn ich Winkel auf sagen M_PI/2 das Ding dreht sich gut. wenn ich es auf 2 * M_PI setze, tut es "nichts". Ich kann verstehen, dass die Matrix in etwas übersetzt, das nichts tut (rotierende 360 ​​bedeutet "bleiben" in einem Sinne), noch, ich will es 5 Mal drehen (denke an eine Zeitung drehen Skala kommt auf Sie Wirkung - ich bin nicht gut zu beschreiben, hoffe jemand versteht). Also, ich habe versucht, Einstellung Winkel bis 180 Grad (M_PI) und fügen Sie eine verschachtelte animatationBlock. aber ich denke, dass, da ich die gleiche Eigenschaft (someview.transition) wieder einstellen es irgendwie ignoriert). Ich habe versucht, Wiederholungszahl der Animation auf 2 mit Winkel M_PI zu setzen, aber es scheint sich einfach um 180 zu drehen, zurück zur geraden Position zu gehen und dann die Drehung erneut einzuleiten.

Also, ich bin ein wenig aus Ideen, jede Hilfe geschätzt! - t

+0

können Sie auch hier beginnen: https://github.com/jonasschnelli/UIView-i7Rotate360 sehr einfach zu implementieren und zu ändern. –

+0

mögliches Duplikat von [UIView Unendliche 360-Grad-Rotationsanimation?] (Http://stackoverflow.com/questions/9844925/uiview-infinite-360-degrade-rotation-animation) –

Antwort

36

Sie können die folgende Animation auf der Ebeneneigenschaft Ihres UIView verwenden. Ich habe es getestet.

UIView *viewToSpin = ...;  
CABasicAnimation* spinAnimation = [CABasicAnimation 
            animationWithKeyPath:@"transform.rotation"]; 
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI]; 
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 
+0

Wie kann ich diese Animation verlangsamen? – mahboudz

+0

Weitere Überlegungen zum Animationstiming finden Sie im Referenzmaterial für das CAMediaTiming-Protokoll, das von CABasicAnimation implementiert wird. Insbesondere möchten Sie wahrscheinlich die Eigenschaft 'duration' festlegen. Der obige Code verwendet die Standarddauer von 0,25 Sekunden. –

1

einen kontinuierlichen Spinn Effekt zu erhalten ist ein wenig kompliziert, aber ich beschreiben ein Mittel es here zu tun. Ja, Kernanimation scheint Transformationen auf die nächste Endposition innerhalb des Einheitskreises zu optimieren. Die Methode, die ich dort beschreibe, kettet ein paar Halbdrehungs-Animationen zusammen, um volle Drehungen zu machen, obwohl Sie ein leichtes Stottern in der Übergabe von einer Animation zur nächsten bemerken.

Vielleicht wäre ein CAKeyframeAnimation, der mit diesen Halbdrehungswerten konstruiert wurde, der richtige Weg. Dann könnten Sie auch die Beschleunigung und Verzögerung steuern.

6

Wie Brad Larson anzeigte, können Sie dies mit einem CAKeyframeAnimation tun. Zum Beispiel können

CAKeyframeAnimation *rotationAnimation; 
rotationAnimation = 
    [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

rotationAnimation.values = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0 * M_PI], 
          [NSNumber numberWithFloat:0.75 * M_PI], 
          [NSNumber numberWithFloat:1.5 * M_PI], 
          [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.timingFunction = 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.duration = 10.0; 

CALayer *layer = [viewToSpin layer]; 
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Sie steuern die Dauer der Gesamt Animation mit der rotationAnimation.duration Eigenschaft, und die Beschleunigung und Verzögerung (und die Berechnung der Zwischenschritte) mit der rotationAnimation.timingFunction Eigenschaft.

1
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = [NSNumber numberWithFloat:0.0f]; 
animation.toValue = [NSNumber numberWithFloat: 2*M_PI]; 
animation.duration = 8.0f; 
animation.repeatCount = INFINITY; 
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"]; 
Verwandte Themen