Frage

Sorry, wenn dies offensichtlich ist, oder an anderer Stelle bedeckt, aber ich habe den ganzen Tag googeln und nicht eine Lösung, die tatsächlich funktioniert.

gefunden

Mein Problem ist wie folgt: ich zur Zeit ein Bild in einem Vollbild-UIView, für Beispiele willen bin zeichnen wir das Bild in der rechten unteren Ecke des UIView sagen werde. Ich möchte eine Rotation tun Transformation (CGAffineTransformMakeRotation) in der Mitte des Bildes, jedoch die Rotationsbefehl dreht sich um die Mitte des UIView es selbst in der Standardeinstellung. Als Ergebnis bewegt sich mein Bild auf dem Bildschirm, wenn ich anstatt es drehe statt und Drehen um die eigene Mitte zu bleiben.

Von dem, was ich gesammelt habe, muß ich meinen Kontext übersetzen, so dass der Ursprung (Mitte des UIView) in der Mitte meines Bildes ist, dreht und dann den Kontext wiederherstellen, indem Sie zurück an den ursprünglichen Ort zu übersetzen.

Das folgende ist die nächste Sache, die ich an der Arbeit bekommen habe, aber das Problem ist, dass, während das Bild dreht, bewegt sie sich nach unten, während es dreht. Ich denke, das durch Animation verursacht wird Tweenen der 1. Schritt übersetzen und dritter Schritt übersetzen, anstatt nur zu realisieren, dass der Anfang und Endpunkt auf den übersetzt das gleiche wäre ...

// Before this i'd make a call to a function that draws a path to a passed in context
CGAffineTransform inverseTranslation = CGAffineTransformMakeTranslation( transX, transY );
CGAffineTransform translation = CGAffineTransformMakeTranslation( -transX, -transY );
CGAffineTransform rot = CGAffineTransformMakeRotation( 3.14 );
CGAffineTransform final = CGAffineTransformConcat( CGAffineTransformConcat( inverseTranslation, rot ), translation );
// Then i apply the transformation animation like normal using self.transform = final etc etc

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

Ich habe seit einigen Tagen mit diesem gekämpft und meine aktuellen Lösung scheint nahe, aber ich habe keine Ahnung, wie dieses übersetzt tweening loszuwerden. Hat jemand eine Lösung für diesen oder einen besseren Weg, um dies zu realisieren?

[Update] Für die Zeit in der Mitte des uiview zentriert zeichne ich mein Bild zu sein und dann die UIView.center Eigenschaft auf den Ursprung gesetzt haben würde ich drehen möchte und dann den Befehl Drehen zu tun. Es scheint ein bisschen wie ein Hack, aber bis ich die wirklichen übersetzt bekommen es funktioniert meine einzige Wahl. Dank!

War es hilfreich?

Lösung

duncanwilcox‘Antwort ist die richtige, aber er verließ den Teil, wo Sie den Anker der Ebene, die Sie herum drehen wollen auf den Punkt der Ansicht ändern.

CGSize sz = theview.bounds.size;
// Anchorpoint coords are between 0.0 and 1.0
theview.layer.anchorPoint = CGPointMake(rotPoint.x/sz.width, rotPoint.y/sz.height);
[UIView beginAnimations:@"rotate" context:nil];
theview.transform = CGAffineTransformMakeRotation( 45. / 180. * M_PI );
[UIView commitAnimations];

Dies ist hier dokumentiert: http: // developer. apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html

Andere Tipps

Dies ist auch eine Option: eine einfache Änderung der Basis; -)

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformTranslate(transform,-x,-y);

wo (x,y) ist das Rotationszentrum Sie wie

Die Drehung geschieht um die anchor der Schicht der Ansicht. Die Standardeinstellung für die anchor ist das Zentrum (0,5, 0,5), so dass die Drehung allein ohne die Übersetzungen sollte ausreichen.

Haben einen schnellen Test und das funktioniert für mich:

[UIView beginAnimations:@"rotate" context:nil];
self.transform = CGAffineTransformMakeRotation( 45. / 180. * 3.14 );
[UIView commitAnimations];

Wenn Sie nicht eine Animation stattfinden soll , aber gerade die neue Rotation setzen, können Sie diese verwenden:

CGFloat newRotation = 3.14f 

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.0]; // no tweening
CGAffineTransform transform = CGAffineTransformMakeRotation(newRotation);
self.transform = transform;
[UIView commitAnimations];

Die Rotation sollte in der Tat stattfindet um die Mitte des UIView. Einstellen der animationDuration auf Null Erfolgs- Garantie sollte kein tweening passieren.

Seien Sie sicher, wenn Sie dies 60-mal pro Sekunde nicht tun. Es ist sehr verlockend Spiel wie Animationen mit diesen Werkzeugen zu erstellen. Diese Art von Animationen sind nicht genau gemeint für einen Rahmen basierend auf Rahmen, „viele Sprites fliegen überall“ -Spiel.

Für die - und ich bin auf diesem Weg -. Der einzige Weg zu gehen, OpenGL ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top