2009-03-02 5 views
1

Mein Usercase ist eine iPhone-Anwendung, wo ich eine Animation auf der Skala, Rotation und Übersetzung eines Bildes mache.So behandeln Sie eine Übersetzung Matrix in einer invertierten Y-Achse Blickwinkel

Also, ich concat alles und ihn an die Eigenschaft verwandeln, aber es gibt ein Problem:

Da meine Bilder in der Größe variieren, es ist ein Problem, sie richtig zu positionieren. Ich bin an ein Koordinatensystem mit invertierter Y-Achse gewöhnt, deshalb möchte ich, dass mein Bild genau auf 60 Pixel in der Y-Achse positioniert wird.

Also, wie ändere ich von der ursprünglichen kartesischen Y-Achse zu einem invertierten Y-Achse Sicht?

Antwort

4

Wie smacl weist darauf hin, ist der einfachste Weg, dies zu tun ist, Verschieben Sie Ihren Ursprung nach links unten auf dem Bildschirm, indem Sie (Bildschirmhöhe - Ansichtshöhe - y) anstelle von y in den Ursprüngen Ihrer Ansichten verwenden.

Sie können jedoch das Koordinatensystem der Layer Ihrer Hauptansicht mit einem CATransform3D spiegeln. Ich tue das, damit ich den gleichen Core Animation CALayer Layout-Code zwischen meiner iPhone-Anwendung und einem Mac-Client teilen kann (das iPhone invertiert das normale Quartz-Koordinatensystem für CALayers, damit es mit dem der UIViews übereinstimmt). Alles, was Sie tun müssen, um dies zu ermöglichen ist die Linie für Ihr Schicht-Hosting UIView

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f); 

in Ihrem Initialisierungscode zu platzieren. Denken Sie daran, dass dies Ihr CALayers Flip wird, so dass jeder UIKit Textdarstellung in diesen Schichten auch ähnlich wie im folgenden unter Verwendung von Code gekippt müssen werden:

CGContextSaveGState(context); 
CGContextTranslateCTM(context, 0.0f, self.frame.size.height); 
CGContextScaleCTM(context, 1.0f, -1.0f); 

UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize]; 
[text drawAtPoint:CGPointZero withFont:theFont]; 

CGContextRestoreGState(context); 

Sie können eine ähnliche Art von Inversion tun, um eine CGAffineTransform, aber Sie wird auch eine Übersetzung anwenden müssen, um diese Arbeit zu machen:

CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height); 
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f); 

Sie können hier die affine Transformation verwenden, um Ihren Ursprung von Koordinaten mit Hilfe CGPointApplyAffineTransform() zu konvertieren.

0

Für jeden y Ordinate, y = top-y, wobei ganz oben auf die y Ordinate des oberen Rand des Begrenzungsrahmens ist es, Sie bei der Erstellung sind.