Ich habe eine UINavigationController
, die in den Querformat-Modus rotiert und einen neuen UIViewController initialisiert und auf den Stack verschiebt. Auf der UIViewController's
viewDidLoad
drucke ich einfach die self.view.frame.size
.
Wenn sich% code_% im Hochformat-Modus befindet, druckt der View-Controller {320, 460}. Wenn sich der Navigationscontroller jedoch im Querformat befindet, ist die Bildgröße genau gleich. (Zur Klarstellung, im zweiten Fall wird UINavigationController
initialisiert, während sich das Telefon bereits im Querformat befindet.)
Sollte die Bildgröße der Ansicht nicht gedreht werden? Und wenn nicht, wie kann ich die richtige Rahmengröße finden, ohne die Zahlen zu kodieren?
Sie können sich nicht auf den Rahmen im Querformat verlassen; Sie müssen eine Kombination von Grenzen und Mitte verwenden; Frame wird mit einer Kombination aus diesen generiert, und wenn eine Nicht-Identitäts-Transformation angewendet wird (wie es in der Landschaft der Fall ist), wird es ein wenig seltsam.
Zuerst müssen Sie Ihre Ansicht so einstellen, dass die Größe automatisch mit einer richtigen autoresizingMask geändert wird. Damit passt sich Ihre Ansicht der Größe des Controllers an.
Sie können dies selbst mit einem NSLog überprüfen. Aber lade es nicht in loadView, das ist zu früh. Setzen Sie dies in viewWillAppear.
Wenn Sie die autoresizingMask Ihrer Ansicht mit Interface Builder festlegen, sollten Sie die Elemente der simulierten Schnittstelle im Inspektor Attribute deaktivieren. Wenn eine dieser Optionen aktiviert ist, können Sie die autoresizingMask im Größeninspektor nicht ändern.
Das ist ein Schmerz und es ist immer noch wahr in iOS 4.2 für iPads. Die Art und Weise, wie ich das gelöst habe, besteht darin, die UIView
, die mit UIViewController
verknüpft ist, abzuleiten. Ich habe das in Interface Builder gemacht, aber ich nehme an, dass man das auch irgendwie im Code machen könnte. Im Interface Builder wählen Sie die UIView in UIViewController
und klicken dann auf das Symbol (i) oben rechts im Inspektorfenster. Klicken Sie unter der Klassenidentität auf das Popup und wählen Sie die UIView-Unterklasse aus.
Der Ansatz besteht darin, dass diese UIView-Unterklasse die layoutSubviews-Methode überschreibt, das nächste UIViewController
findet, bestimmt, ob sie eine reactToLayout-Methode implementiert (eine Methode, die Sie in der Unterklasse UIViewController
für den View-Controller implementieren müssen) diese Aussicht). Wenn die reactToLayout-Methode in der ersten gefundenen UIViewController
existiert, wird sie aufgerufen.
Die reactToLayout-Methode im View-Controller macht dann alles, was Sie tun müssen, um erfolgreich zu sein, da der Frame der Ansicht zu diesem Zeitpunkt richtig eingerichtet ist (im Gegensatz zu ViewDidLoad
, viewWillAppear
oder sogar% Code%). Ich habe eine Methode, die ich jederzeit die Ausrichtung oder Rahmenänderungen aufrufen. Es ist ein Schmerz, aber ich speichere den letzten Rahmen und die letzte Orientierung, die in internen Variablen des View-Controllers angelegt sind. Das interne Layout für eine neue Ausrichtung oder Frame-Wechsel-Methode vergleicht diese mit dem aktuellen Frame der Ansicht und der angeforderten oder aktuellen Ausrichtung, so dass es nicht unnötigerweise immer wieder neu angeordnet wird.
Hier ist der Code:
UILayoutSubviewsView.h
%Vor%UILayoutSubviewsView.m
%Vor%YourViewController.h
%Vor%YourViewController.m
%Vor%Hallo an alle Ich denke, dass es eine einfache Lösung gibt, die die Arbeit für mich erledigt Sie können currentSize statt self.view.frame.size
verwendenin yourClass.h
%Vor%in yourClass.m
%Vor%Tags und Links iphone cocoa-touch