CGAffineTransform Rotation geht in die falsche Richtung

8

In meinem Experiment schließe ich diese:

%Vor%

dreht die Ansicht im Uhrzeigersinn und

%Vor%

dreht die Ansicht gegen den Uhrzeigersinn,

Aber das Dokument sagt:

Der Winkel im Bogenmaß, um den die affine Transformation gedreht werden kann. In iOS gibt ein positiver Wert die Drehung gegen den Uhrzeigersinn und ein negativer Wert die Drehung im Uhrzeigersinn an.

widersprechen diese einander?

    
romox 31.07.2012, 02:01
quelle

1 Antwort

23

Ihre Verwirrung ist ziemlich verständlich.

In Wahrheit repräsentiert ein positiver Winkel eine Drehung von der positiven X-Achse zur positiven Y-Achse. Ein negativer Winkel repräsentiert eine Drehung von der positiven X-Achse zur negativen Y-Achse.

Das "native" Core Graphics-Koordinatensystem ist dem Standard kartesischen Koordinatensystem nachempfunden, in dem die Y-Achse zunimmt nach oben auf der Seite. In diesem System stellt ein positiver Winkel eine Drehung gegen den Uhrzeigersinn dar:

Wenn Sie also Ihr eigenes CGContext erstellen (zum Beispiel mit CGBitmapContextCreate oder CGPDFContextCreate ), funktionieren die Rotationen wie erwartet.

Allerdings haben Computersysteme historisch ein Koordinatensystem verwendet, bei dem die Y-Achse auf der Seite nach unten zunimmt. In einem umgedrehten Koordinatensystem repräsentiert ein positiver Winkel eine Drehung im Uhrzeigersinn:

Beachten Sie, dass sich in beiden Koordinatensystemen ein positiver Winkel von der positiven X-Achse zur positiven Y-Achse dreht.

Es stellt sich heraus, dass UIKit das Koordinatensystem der Grafikkontexte umkehrt, die es für Sie erstellt. Dies umfasst den Grafikkontext, den er vor dem Senden von drawRect: erstellt, und den Grafikkontext, den er in UIGraphicsBeginImageContext erstellt. (Die Quartz 2D-Programmierleitfaden erläutert dies.) Sie können dies überprüfen, indem Sie sich die aktuelle Transformationsmatrix ansehen (mit CGContextGetCTM ). Sie werden sehen, dass es ein -1 in seinem Element d hat, was bedeutet, dass die Y-Achse umgedreht ist.

A UIView verwendet auch ein geflipptes Koordinatensystem zum Auslegen seiner Unteransichten, was sich auf die Bedeutung der Eigenschaft UIView transform auswirkt.

    
rob mayoff 31.07.2012, 03:30
quelle