2012-06-19 12 views
5

Ich verwende eine Rotationsanimation erstellt mit CABasicAnimation. Es dreht sich ein UIView über 2 Sekunden. Aber ich muss in der Lage sein, es zu stoppen, wenn die UIView berührt wird. Wenn ich die Animation entferne, befindet sich die Ansicht an derselben Position wie vor dem Start der Animation.Stop CABasicAnimation an bestimmten Punkt

Hier ist meine Animation Code:

float duration = 2.0; 
float rotationAngle = rotationDirection * ang * speed * duration; 
//rotationAngle = 3*(2*M_PI);//(double)rotationAngle % (double)(2*M_PI) ; 
CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: rotationAngle ]; 
rotationAnimation.duration = duration; 
rotationAnimation.cumulative = YES; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.delegate = self; 

[self.view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Wie kann ich die UIView ‚s Drehung rechts halten, wo es ist, wenn es berührt wird? Ich weiß, wie man den Berührungsteil verwaltet, aber ich kann nicht herausfinden, wie man die Ansicht im gegenwärtigen Winkel der Animation stoppt.

Lösung: Ich löste das Problem, indem ich den Winkel der Darstellungsschicht erhielt, die Animation entfernend und die Transformation der Ansicht einstellte. Hier ist der Code:

[self.view.layer removeAllAnimations];  
CALayer* presentLayer = self.view.layer.presentationLayer; 
float currentAngle = [(NSNumber *)[presentLayer valueForKeyPath:@"transform.rotation.z"] floatValue]; 
self.view.transform = CGAffineTransformMakeRotation(currentAngle); 
+1

wo haben Sie die obige Lösung gegeben ?? Ich bekomme immer Winkel 0,0000 – Hisenberg

Antwort

15

Gute Frage! Dazu ist es hilfreich, die Core-Animation-Architektur zu kennen.

Wenn Sie das Diagramm in der Core Animation Programming Guide, die die Core Animation Rendering-Architektur beschreibt, überprüfen, können Sie sehen, dass es drei Bäume gibt.

Sie haben die Modell Baum. Hier legen Sie die Werte fest, die Sie wünschen zu passieren. Dann gibt es die Präsentation Baum. Das ist, was die Laufzeit angeht, ziemlich genau. Dann ist endlich der Render Baum. Das sieht der Benutzer.

In Ihrem Fall möchten Sie die Werte der Präsentation Baum abfragen.

Es ist einfach zu tun. Rufen Sie für die Ansicht, dass Sie die Animation angefügt haben, die layer und für die layer die Werte ab. Zum Beispiel:

CATransform3D myTransform = [(CALayer*)[self.view.layer presentationLayer] transform]; 

Es gibt keine Möglichkeit, eine Animation mitten im Fluss "anzuhalten". Alles, was Sie tun können, ist, die Werte abzufragen, sie zu entfernen und sie dann an der Stelle, an der Sie aufgehört haben, erneut zu erstellen.

Es ist ein bisschen Schmerz!

Werfen Sie einen Blick auf einige meiner anderen Beiträge, wo ich in etwas mehr Detail, z.

Restoring animation where it left off when app resumes from background

Sie auch nicht vergessen, dass, wenn Sie eine Animation auf eine Schicht Sicht hinzufügen, Sie ändern sich nicht tatsächlich die Eigenschaften der zugrunde liegenden Ansicht. Was passiert also?Wir bekommen seltsame Effekte, bei denen die Animation aufhört und Sie die Ansicht in ihrer ursprünglichen Position sehen.

Dort müssen Sie die CAAnimation Delegierten verwenden. Werfen Sie einen Blick auf meine Antwort auf dieses Thema, wo ich diese abdecken:

CABasicAnimation rotate returns to original position

+1

Vielen Dank für die Erklärung der Präsentationsschicht. Ich löste das Problem, indem ich den Drehwinkel der presentationLayer mit valueForKeyPath: ermittelte, die Umwandlung der Ansicht einstellte und die Animation entfernte. –

5

Sie müssen die Drehung auf die Drehung der presentationLayer setzen und dann die Animation aus der Schicht zu entfernen. Sie können über die Präsentationsebene in meinem Blogpost über Hit testing animating layers lesen.

Der Code, der die endgültige Rotation zu versetzen so etwas wie wäre:

self.view.layer.transform = [(CALayer*)[self.view.layer presentationLayer] transform]; 
[self.view.layer removeAnimationForKey:@"rotationAnimation"]; 
Verwandte Themen