2009-05-18 14 views
7

Ich beantrage eine Rotation Animation in einem Animationsblock mit dieser Transformation transformieren:Gibt es eine Möglichkeit herauszufinden, um wie viele Grad eine Ansicht während einer Animation gedreht wird?

CATransform3D rotatedTransform = self.layer.transform; 
rotatedTransform = CATransform3DRotate(rotatedTransform, 90 * M_PI/180.0, 0.0f, 0.0f, 1.0f); 
self.layer.transform = rotatedTransform; 

Die Animation beginnt, und der Benutzer Tritte in einem anderen Fall, dass die Drehung in Richtung eines neuen Ziel schieben würde. Um ein realistisch aussehendes Verhalten zu berechnen, muss ich wissen, wie hoch der Grad der Drehung ist, damit die nächsten Drehgrade angemessen addiert werden können.

+1

Die zweite Antwort (von Tess Lowe), um diese Frage beantwortet. Sie sollten es als Akzeptiert markieren. – MikeyWard

Antwort

4

Sie können den aktuellen Status einer animierenden Ebene abrufen, indem Sie die presentationLayer verwenden. Unter der Annahme, dass man alle anderen Transformationen auf die Schicht nicht aufgetragen haben, können Sie den aktuellen Winkel der rotierenden Schicht extrahieren Code verwendet wie den folgenden:

CATransform3D rotationTransform = [(CALayer *)[self.layer presentationLayer] transform]; 
float angle; 
if (rotationTransform.m11 < 0.0f) 
    angle = 180.0f - (asin(rotationTransform.m12) * 180.0f/M_PI); 
else 
    angle = asin(rotationTransform.m12) * 180.0f/M_PI; 

In einer ansonsten unmodifizierte Transformation, die m11 und m12 Werte sind Koordinaten, die liegen Sie auf dem Einheitskreis, damit Sie den Winkel, den sie beschreiben, mit Trigonometrie bestimmen können.

BEARBEITEN (18.05.2009): CALayer wurde eine Typumwandlung hinzugefügt, um Compilerwarnungen zu beseitigen und die Namensgebung der Transformation in den Trigonometrieoperationen zu korrigieren.

+0

Die erste Zeile funktioniert nicht. Der Compiler beendet das Kompilieren. "Invalid initializer" und "mehrere Methoden gefunden namens -transform". Eröffnet eine andere Frage, wie man das richtig macht. Andere im Netz (Suchmaschine) scheinen dieselben Probleme zu haben, die Werte von der Präsentationsebene zu bekommen. – Thanks

+0

Ich habe vergessen, CALayer eine Typumwandlung hinzuzufügen, um die Warnungen des Compilers zu umgehen. Außerdem habe ich die Verweise auf rotationTransform später in der Berechnung korrigiert. Ich habe das getestet und es funktioniert für eine rotierende Ansicht. –

+0

Ich habe eine Aktionsmethode eingerichtet, die aufgerufen wird, wenn ich auf eine Schaltfläche tippe. Dann zünde ich die Animation mit 10 Sekunden Dauer und 180 ° Drehung an. Die Ansicht dreht sich langsam. Während es sich dreht, klicke ich weiter auf den Knopf. Die Aktionsmethode führt den Code aus, um den Winkel zu erhalten, aber der Winkel ist 0.0, solange die Animation läuft. Wenn es fertig ist, und ich frage noch einmal nach dem Winkel, bekomme ich es: 180.0 ... aus irgendeinem Grund funktioniert das nicht während der Animation. Gerade wenn es fertig ist. – Thanks

27

Dies ist eine alte Frage, aber ich über diese Antwort kam bei dem Versuch, den aktuellen Drehwinkel während einer Keyframe-Animation zu finden: -

CALayer* layer = [self.layer presentationLayer]; 
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue]; 

scheinen für mich zu arbeiten. Auch, nett und prägnant.

+2

Perfekt. Prägnant. Dies sollte als Antwort der Frage akzeptiert werden. – MikeyWard

0

Sie können es auch mit Matrizen und Trigonometrie berechnen. für diese auf meine Antwort Siehe question

0

Try this:

CGFloat setAngle = 75.0; 
CATransform3D t = CATransform3DIdentity; 
t.m34 = 0.004; 
t = CATransform3DRotate(t, -M_PI/180*setAngle, 0, 1, 0); 
self.testView.layer.transform = t; 

CGFloat getAngle = 0; 
if (t.m11 < 0.0f) { 
    getAngle = 180.0f - (asin(t.m13) * 180.0f/M_PI); 
} else { 
    getAngle = asin(t.m13) * 180.0f/M_PI; 
} 
NSLog(@"setAngle=%@ getAngle=%@", @(setAngle), @(getAngle)); 
Verwandte Themen