20 Stimmen

Über die Richtung der Drehung von CGAffineTransformMakeRotation?

Ich versuche, CGAffineTransformMakeRotation zu verwenden, und ich beziehe mich auf das Apple-Dokument, das besagt

Der Winkel, in Bogenmaß, um den diese Matrix die Achsen des Koordinatensystems dreht. In iOS gibt ein positiver Wert eine Drehung gegen den Uhrzeigersinn an, und ein negativer Wert gibt eine Drehung im Uhrzeigersinn an. In OS X gibt ein positiver Wert eine Drehung im Uhrzeigersinn an, und ein negativer Wert gibt eine Drehung gegen den Uhrzeigersinn an.

Also, wenn ich den Parameter 90 Grad übergebe, sollte es eine Drehung gegen den Uhrzeigersinn sein.
self.myView ist eine Ansicht mit grauem Hintergrund, und die rote quadratische Ansicht dient nur dazu, die Drehrichtung zu sehen

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[self.myView setTransform:rotation];

Vor der Rotation Nach der Rotation

Aber warum dreht es sich im Uhrzeigersinn?
Ich versuche es im Simulator und auf dem Gerät, beide haben das gleiche Ergebnis, eine Drehung im Uhrzeigersinn
Und dann versuche ich eine Animation zu verwenden:

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[UIView animateWithDuration:0.5
                 animations:^{
                     self.myView.transform = rotation;
                 }
                 completion:^(BOOL finished) {
                     NSLog(@"%@", NSStringFromCGAffineTransform(self.myView.transform));
                 }];

Es hat das gleiche Ergebnis, eine Drehung im Uhrzeigersinn.

Kann jemand erklären, warum? Danke für die Antwort.

19voto

Serhii Yakovenko Punkte 12136

Dies ist ein Fehler in der Dokumentation.

Hier beschreiben sie die Matrix und geben die Gleichungen an, die sie zur Transformation verwenden:

Bildbeschreibung eingeben

Wenn Sie die Mathematik durchführen, werden Sie feststellen, dass es für positive Winkel eine Drehung gegen den Uhrzeigersinn ergibt, wenn die Richtung der Y-Achse nach oben zeigt, wie in OS X und im Uhrzeigersinn, wenn die Y-Achse nach unten zeigt, wie in iOS.

Zum Beispiel können Sie versuchen, den Punkt (5,0) um 90 Grad zu transformieren, Sie erhalten (0,5), was bedeutet im Uhrzeigersinn für iOS und gegen den Uhrzeigersinn für OS X.

Derselbe Teil der Dokumentation enthält immer noch den (falschen) Teil, den Sie zitiert haben:

In iOS bedeutet ein positiver Wert eine Drehung gegen den Uhrzeigersinn, und ein negativer Wert bedeutet eine Drehung im Uhrzeigersinn. In OS X bedeutet ein positiver Wert eine Drehung im Uhrzeigersinn, und ein negativer Wert bedeutet eine Drehung gegen den Uhrzeigersinn.

Was eindeutig falsch ist, denn die Gleichungen (die Teil des gleichen Dokuments sind und ziemlich Standard-Drehungsgleichungen sind) sagen das Gegenteil.

8voto

Ben Kane Punkte 8750

Dies ist tatsächlich korrektes Verhalten, und die Dokumentation beschreibt es korrekt.

Hier haben Sie es mit zwei verschiedenen Koordinatensystemen zu tun. Das Koordinatensystem von Core Graphics hat (0, 0) unten links, das Koordinatensystem von UIKit hat jedoch (0, 0) oben links. Beide Koordinatensysteme haben eine X-Achse mit 0 auf der linken Seite. Mit anderen Worten, das Koordinatensystem von UIKit ist das Koordinatensystem von Core Graphics vertikal gespiegelt. Das folgende Bild zeigt den Unterschied:

Vergleich der UIKit- und Core Graphics-Koordinatensysteme


Lassen Sie uns nun Ihr Zitat betrachten:

 

Der Winkel, in Bogenmaß, um den diese Matrix die Koordinatenachsen dreht. In iOS gibt ein positiver Wert eine Drehung gegen den Uhrzeigersinn an, und ein negativer Wert eine Drehung im Uhrzeigersinn.

Beim ersten Hinsehen scheint das falsch zu sein, aber Sie haben etwas übersehen. Dies ist ein Zitat aus der CGAffineTransformMakeRotation-Referenz. Dies ist Teil der Core Graphics-Referenz, nicht der UIKit-Referenz. Es bezieht sich auf die Drehung als gegen den Uhrzeigersinn im Koordinatensystem von Core Graphics.

Sie können sich diese Rotation in Ihrem Kopf vorstellen, indem Sie das, was Sie auf dem Bildschirm sehen, vertikal umkehren und sich vorstellen, wie die Rotation aussehen würde.

Tatsächlich hat die CGAffineTransformMakeRotation-Referenz einen Diskussionseintrag, der dies dokumentiert:

 

Die tatsächliche Drehrichtung hängt von der Koordinatensystemausrichtung der Zielplattform ab, die in iOS und macOS unterschiedlich ist.


Der Diskussionseintrag zur rotate(by:) Methode in der CGContext-Referenz beschreibt dieses Verhalten etwas genauer:

 

Die Richtung, in der der Kontext gedreht wird, kann durch den Zustand der aktuellen Transformationsmatrix vor Ausführung dieser Funktion verändert erscheinen. Zum Beispiel wendet eine UIView auf iOS eine Transformation auf den Grafikkontext an, die die Y-Achse umkehrt (indem sie sie mit -1 multipliziert). Das Drehen des Benutzerkoordinatensystems auf ein Koordinatensystem, das zuvor umgekehrt wurde, führt zu einer Drehung in die entgegengesetzte Richtung (dh positive Werte scheinen das Koordinatensystem im Uhrzeigersinn zu drehen).

7voto

Maniac One Punkte 589

Um eine gegen den Uhrzeigersinn Drehung zu erhalten.. machen Sie Ihren Winkel negativ z.B.:

*

imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // für eine Drehung gegen den Uhrzeigersinn
imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // für eine Drehung im Uhrzeigersinn

*

0voto

Sridhara Shetty Punkte 87

Nicht verwirren lassen. Es ist falsch in der Apple-Dokumentation.

CGAffineTransformMakeRotation(-Winkel) // für gegen den Uhrzeigersinn Drehung CGAffineTransformMakeRotation(Winkel) // für im Uhrzeigersinn Drehung

0voto

Yogesh Tarsariya Punkte 341

Ich habe einen einfachen Code, um ein Bild in verschiedene Richtungen zu drehen.

int Count==1;
- (IBAction)Btn_Image:(id)sender {
if (Count==1) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationRight];
    self.Img_Canvas.image = image;
}
else if (Count == 2) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationDown];
    self.Img_Canvas.image = image;
}
else if (Count == 3) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationLeft];
    self.Img_Canvas.image = image;
}
else if (Count == 4) {
    Count = 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationUp];
    self.Img_Canvas.image = image;
}}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X