Ich habe eine App, in der ich die Gerätedrehung in bestimmten Ansichten unterstützen möchte, andere jedoch im Querformat nicht besonders sinnvoll sind. Wenn ich die Ansichten austausche, möchte ich die Drehung auf Hochformat setzen.
Auf UIDevice gibt es einen undokumentierten Eigenschaftssetter, der den Trick ausführt, aber offensichtlich eine Compiler-Warnung generiert und bei einer zukünftigen Überarbeitung des SDK verschwinden könnte.
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
Gibt es dokumentierte Möglichkeiten, die Orientierung zu erzwingen?
Update: Ich dachte, ich würde ein Beispiel liefern, da ich nicht nach shouldAutorotateToInterfaceOrientation suche, da ich das bereits implementiert habe.
Ich möchte, dass meine App Querformat und Hochformat in Ansicht 1 unterstützt, aber nur Hochformat in Ansicht 2. Ich habe shouldAutorotateToInterfaceOrientation bereits für alle Ansichten implementiert. Wenn sich der Benutzer jedoch in Ansicht 1 im Querformat befindet und dann zu Ansicht 2 wechselt, möchte ich das erzwingen Telefon, um zurück zum Porträt zu drehen.
quelle
Antworten:
Dies ist beim späteren iPhone 3.1.2 SDK kein Problem mehr. Es scheint nun die angeforderte Ausrichtung der Ansicht zu berücksichtigen, die auf den Stapel zurückgeschoben wird. Dies bedeutet wahrscheinlich, dass Sie ältere iPhone-Betriebssystemversionen erkennen und setOrientation nur anwenden müssen, wenn es vor der neuesten Version liegt.
Es ist nicht klar, ob die statische Analyse von Apple versteht, dass Sie die älteren SDK-Einschränkungen umgehen. Ich persönlich wurde von Apple angewiesen, den Methodenaufruf bei meinem nächsten Update zu entfernen, sodass ich noch nicht sicher bin, ob ein Hack für ältere Geräte den Genehmigungsprozess durchlaufen wird.
quelle
Dies ist lange nachträglich, aber nur für den Fall, dass jemand vorbeikommt, der keinen Navigationscontroller verwendet und / oder keine undokumentierten Methoden verwenden möchte:
Es reicht aus, einen Vanilla View Controller zu präsentieren und zu schließen.
Natürlich müssen Sie die Ausrichtung in Ihrer Überschreibung von shouldAutorotateToInterfaceOrientation noch bestätigen oder verweigern. Dies führt jedoch dazu, dass shouldAutorotate ... vom System erneut aufgerufen wird.
quelle
Wenn Sie erzwingen möchten, dass es vom Hoch- zum Querformat gedreht wird, finden Sie hier den Code. Beachten Sie nur, dass Sie die Mitte Ihrer Ansicht anpassen müssen. Ich bemerkte, dass meine die Aussicht nicht an der richtigen Stelle platzierte. Ansonsten hat es perfekt funktioniert. Danke für den Tipp.
quelle
CGAffineTransformMakeRotation
die Ansicht zu drehen, aber die UIAlertView entspricht immer noch der Ausrichtung der Statusleiste, dh -degreeToRadian (Winkel)? Hast du so etwas bekommen?UIAlertView
besteht darin, Ihren View-Controller als Delegierten von alertView festzulegen und dann auf :- (void) didPresentAlertView:(UIAlertView *) alertView
, die Rotation basierend auf dem aktuellen durchzuführen[UIApplication sharedApplication].statusBarOrientation
. Wenn Sie es nicht animieren, sollte es nicht zu komisch aussehen.Soweit ich das beurteilen kann,
setOrientation:
funktioniert die Methode nicht (oder funktioniert möglicherweise nicht mehr). Folgendes mache ich, um dies zu tun:Fügen Sie diese Definition zuerst oben in Ihre Datei ein, direkt unter Ihren #imports:
dann in der
viewWillAppear:
MethodeWenn Sie möchten, dass das animiert wird, können Sie das Ganze wie folgt in einen Animationsblock einbinden:
Anschließend können Sie in Ihrem Hochformat-Modus-Controller den umgekehrten Vorgang ausführen. Überprüfen Sie, ob er sich derzeit im Querformat befindet, und drehen Sie ihn in diesem Fall wieder auf Hochformat.
quelle
Ich hatte ein Problem, bei dem ich ein
UIViewController
Bild in Querformat auf dem Bildschirm hatteUINavigationController
. Wenn der nächste Ansichts-Controller in den Fluss gedrückt wird, musste das Gerät jedoch zur Hochformatausrichtung zurückkehren.Was mir aufgefallen ist, war, dass die
shouldAutorotateToInterfaceOrientation:
Methode nicht aufgerufen wird, wenn ein neuer Ansichts-Controller auf den Stapel geschoben wird, sondern aufgerufen wird, wenn ein Ansichts-Controller aus dem Stapel entfernt wird .Aus diesem Grund verwende ich diesen Codeausschnitt in einer meiner Apps:
Grundsätzlich ist es möglich, die Benutzeroberfläche so zu gestalten, dass sie in die Hochformatposition zurückkehrt, indem Sie einen leeren Ansichts-Controller erstellen, ihn auf den Stapel schieben und ihn sofort entfernen. Sobald der Controller geknallt wurde, drücke ich einfach auf den Controller, den ich zuerst drücken wollte. Optisch sieht es gut aus - der leere, beliebige Ansichts-Controller wird vom Benutzer nie gesehen.
quelle
Es gibt eine einfache Möglichkeit, das iPhone programmgesteuert in die erforderliche Ausrichtung zu zwingen - unter Verwendung von zwei der bereits bereitgestellten Antworten von kdbdallas , Josh :
klappt wunderbar :)
BEARBEITEN:
für iOS 6 muss ich folgende Funktion hinzufügen: (funktioniert auf modal viewcontroller)
quelle
Ich habe gegraben und nach einer guten Lösung dafür gesucht. Wir haben diesen Blog-Beitrag gefunden, der den Trick macht: Entfernen Sie Ihre äußerste Ansicht aus dem Schlüssel
UIWindow
und fügen Sie sie erneut hinzu. Das SystemshouldAutorotateToInterfaceOrientation:
fragt dann die Methoden von Ihren Ansichtscontrollern erneut ab und erzwingt die korrekte Ausrichtung, die angewendet werden soll. Sehen Sie es: iphone zwingt uiview, sich neu zu orientierenquelle
Joshs Antwort funktioniert gut für mich.
Ich poste jedoch lieber eine Benachrichtigung "Die Ausrichtung hat sich geändert, bitte aktualisieren Sie die Benutzeroberfläche" . Wenn diese Benachrichtigung von einem Ansichts-Controller empfangen wird, ruft er auf
shouldAutorotateToInterfaceOrientation:
, sodass Sie eine beliebige Ausrichtung festlegen können, indemYES
Sie zur gewünschten Ausrichtung zurückkehren .Das einzige Problem ist, dass dies eine Neuorientierung ohne Animation erzwingt . Sie müssten diese Linie zwischen
beginAnimations:
undcommitAnimations
umbrechen, um einen reibungslosen Übergang zu erreichen.Hoffentlich hilft das.
quelle
FWIW, hier ist meine Implementierung der manuellen Einstellung der Ausrichtung (um in den Root View Controller Ihrer App zu gelangen, natch):
gekoppelt mit der folgenden
UINavigationControllerDelegate
Methode (vorausgesetzt, Sie verwenden aUINavigationController
):Dadurch wird die Stammansicht gedreht, je nachdem, ob ein eingehender
UIViewController
Vorgang die aktuelle Geräteorientierung unterstützt. Schließlich möchten Sie sichrotateInterfaceToOrientation
mit den tatsächlichen Änderungen der Geräteorientierung verbinden, um die Standard-iOS-Funktionalität nachzuahmen. Fügen Sie diesen Ereignishandler demselben Root-View-Controller hinzu:Registrieren Sie sich schließlich für
UIDeviceOrientationDidChangeNotification
Benachrichtigungen ininit
oderloadview
ähnlichem:quelle
shouldAutorotate
Methode tun (siehe stackoverflow.com/a/12586002/5171 ).Das funktioniert bei mir (danke Henry Cooke):
Das Ziel für mich war es, nur Änderungen der Landschaftsorientierung zu behandeln.
Init-Methode:
quelle
Mir ist klar, dass der obige ursprüngliche Beitrag in diesem Thread jetzt sehr alt ist, aber ich hatte ein ähnliches Problem damit - dh. Alle Bildschirme in meiner App sind nur Hochformat, mit Ausnahme eines Bildschirms, der vom Benutzer zwischen Querformat und Hochformat gedreht werden kann.
Dies war recht einfach, aber wie bei anderen Posts wollte ich, dass die App unabhängig von der aktuellen Geräteausrichtung automatisch zum Hochformat zurückkehrt, wenn ich zum vorherigen Bildschirm zurückkehre.
Die von mir implementierte Lösung bestand darin, die Navigationsleiste im Querformat auszublenden, sodass der Benutzer nur im Hochformat zu den vorherigen Bildschirmen zurückkehren kann. Daher können alle anderen Bildschirme nur im Hochformat angezeigt werden.
Dies hat auch den zusätzlichen Vorteil für meine App, dass im Querformat mehr Bildschirmplatz verfügbar ist. Dies ist nützlich, da auf dem betreffenden Bildschirm PDF-Dateien angezeigt werden.
Hoffe das hilft.
quelle
Ich habe das am Ende ziemlich leicht gelöst. Ich habe jeden der oben genannten Vorschläge ausprobiert und bin immer noch zu kurz gekommen. Das war meine Lösung:
Im ViewController, der Querformat bleiben muss (links oder rechts), achte ich auf Orientierungsänderungen:
Dann in didRotate:
Beachten Sie alle Super Views / Subviews, die die automatische Größenänderung verwenden, da die view.bounds / frame explizit zurückgesetzt werden ...
Die einzige Einschränkung bei dieser Methode zum Beibehalten der Ansicht "Landschaft" ist die inhärente Animationsumschaltung zwischen Ausrichtungen, die auftreten muss, wenn es besser wäre, wenn sie scheinbar keine Änderung aufweist.
quelle
iOS 6-Lösung:
Der genaue Code hängt von der App ab und auch davon, wo Sie ihn platzieren (ich habe ihn in meinem AppDelegate verwendet). Ersetzen Sie
[[self window] rootViewController]
durch das, was Sie verwenden. Ich habe einUITabBarController
.quelle
Ich habe eine Lösung gefunden und etwas auf Französisch geschrieben (aber der Code ist auf Englisch). Hier
Der Weg besteht darin, den Controller zur Fensteransicht hinzuzufügen (der Controller muss über eine gute Implementierung der Funktion shouldRotate .... verfügen).
quelle
Wenn Sie UIViewController verwenden, gibt es folgende Methode:
Kehren Sie
NO
zu den Ansichts-Controllern zurück, die die Ansichten enthalten, die Sie nicht drehen möchten.Mehr Infos hier
quelle
Ich denke nicht, dass dies zur Laufzeit möglich ist, obwohl Sie natürlich einfach eine 90-Grad-Transformation auf Ihre Benutzeroberfläche anwenden könnten.
quelle
Das benutze ich. (Sie erhalten einige Kompilierungswarnungen, die jedoch sowohl im Simulator als auch auf dem iPhone funktionieren.)
quelle