Kann ich den Ursprung verschieben, wenn ich eine Transformation in Quartz 2D für das iPhone mache?

8

Tut mir leid, wenn das offensichtlich ist oder anderswo behandelt wird, aber ich habe den ganzen Tag gegoogelt und keine Lösung gefunden, die wirklich funktioniert hat.

Mein Problem ist wie folgt: Ich zeichne gerade ein Bild in einer Vollbild-UIView, zum Beispiel, wir sagen, das Bild befindet sich in der unteren rechten Ecke der UIView. Ich würde gerne eine Rotationstransformation (CGAffineTransformMakeRotation) in der Mitte des Bildes machen, jedoch rotiert der Rotationsbefehl standardmäßig um die Mitte der UIView selbst. Als Ergebnis bewegt sich mein Bild auf dem Bildschirm, wenn ich es rotiere, anstatt es an seinem Platz zu belassen und um seine eigene Mitte zu drehen.

Nach dem, was ich gesammelt habe, muss ich meinen Kontext so übersetzen, dass der Ursprung (Mittelpunkt der UIView) im Zentrum meines Bildes steht, Drehen, und dann den Kontext wiederherstellen, indem ich zum ursprünglichen Punkt zurückübersetze.

Das Folgende ist das nächste, was ich zur Arbeit gebracht habe, aber das Problem ist, dass sich das Bild während der Drehung nach unten bewegt, während es sich dreht. Ich denke, dass dies durch Animation Tweening der 1. Schritt übersetzen und 3. Schritt übersetzen verursacht wird, anstatt nur zu erkennen, dass der Anfang und der Endpunkt auf den Übersetzungen wäre das gleiche ...

%Vor%

Ich habe auch Sachen wie CGContextTranslateCTM und CGContextSaveGState / UIGraphicsPushContext ausprobiert, aber diese scheinen wenig Wirkung zu haben.

Ich kämpfe seit Tagen damit und meine derzeitige Lösung scheint nah dran zu sein, aber ich habe keine Ahnung, wie ich dieses Übersetzungs-Tweening los werde. Hat jemand dafür eine Lösung oder einen besseren Weg?

[Aktualisierung] Momentan zeichne ich mein Bild in der Mitte der UIview zentriert und setze dann die Eigenschaft UIView.center auf den Ursprung, den ich drehen möchte, und führe dann den Befehl rotieren aus. Scheint wie ein bisschen wie ein Hack, aber bis ich die echten Übersetzungen bekomme funktioniert es ist meine einzige Wahl. Danke!

    
Skyler 22.03.2009, 04:48
quelle

4 Antworten

14

duncanwilcox 'Antwort ist die richtige, aber er hat den Teil weggelassen, in dem Sie den Anker der Ansichtsebene auf den Punkt setzen, um den Sie sich drehen möchten.

%Vor%

Dies ist hier dokumentiert: Ссылка

    
n8gray 01.06.2009, 20:30
quelle
7

Dies ist auch eine Option: ein einfacher Wechsel der Basis; -)

%Vor%

wobei (x,y) das Rotationszentrum ist, das Sie mögen

    
Abramodj 22.04.2012 22:42
quelle
2

Die Drehung erfolgt um den Ankerpunkt der Ebene der Ansicht. Der Standardwert für den Ankerpunkt ist der Mittelpunkt (0,5, 0,5), daher sollte die Rotation allein ohne die Übersetzungen ausreichen.

Habe einen schnellen Test gemacht und das funktioniert für mich:

%Vor%     
duncanwilcox 27.03.2009 12:27
quelle
1

Wenn Sie nicht möchten, dass eine Animation eintritt , sondern einfach die neue Rotation festlegen, können Sie Folgendes verwenden:

%Vor%

Die Rotation sollte tatsächlich um das Zentrum der UIView stattfinden. Wenn animationDuration auf null gesetzt wird, wird garantiert, dass kein Tweening stattfindet.

Seien Sie sicher, obwohl Sie dies nicht 60 Mal pro Sekunde tun. Es ist sehr verlockend, Spiele wie Animationen mit diesen Tools zu erstellen. Diese Art von Animationen sind nicht genau für ein Frame-to-Frame-basiertes "Spiel mit vielen Sprites" gedacht.

Dafür - und ich bin diesen Weg gegangen - ist der einzige Weg zu gehen OpenGL.

    
Kriem 27.03.2009 13:05
quelle