Ich habe eine iPhone-App, die eine UINavigationController
Drilldown-Oberfläche verwendet: Zuerst eine Ansicht, dann eine andere, bis zu vier Ebenen tief. Ich möchte, dass die ersten drei Ansichten auf die Ausrichtung im Hochformat beschränkt sind und nur die letzte Ansicht im Querformat gedreht werden darf. Bei der Rückkehr von der vierten zur dritten und vierten Ansicht im Querformat möchte ich, dass sich alles wieder im Hochformat dreht.
In iOS 5 habe ich einfach shouldAutorotateToInterfaceOrientation:
in jedem meiner Ansichts-Controller definiert, dass für die zulässigen Ausrichtungen JA zurückgegeben werden soll. Alles funktionierte wie oben beschrieben, einschließlich der Rückkehr zum Hochformat, auch wenn das Gerät bei der Rückkehr von View Controller Nr. 4 zu Nr. 3 im Querformat gehalten wurde.
In iOS 6 drehen sich alle View-Controller in den Querformat und brechen diejenigen, die nicht dazu gedacht waren. In den Versionshinweisen zu iOS 6 heißt es
Es wird mehr Verantwortung auf die App und den App-Delegierten übertragen. Jetzt
UINavigationController
konsultieren iOS-Container (z. B. ) ihre Kinder nicht mehr, um festzustellen, ob sie eine Autorotation durchführen sollen. [...] Das System fragt den obersten Vollbild-View-Controller (normalerweise den Root-View-Controller) nach seinen unterstützten Schnittstellenausrichtungen, wenn sich das Gerät dreht oder wenn einem View-Controller der modale Vollbild-Präsentationsstil präsentiert wird. Darüber hinaus werden die unterstützten Ausrichtungen nur abgerufen, wenn dieser Ansichtscontroller von seinershouldAutorotate
Methode JA zurückgibt . [...] Das System ermittelt, ob eine Ausrichtung unterstützt wird, indem es den von der App-supportedInterfaceOrientationsForWindow:
Methode zurückgegebenen Wert mit dem von dersupportedInterfaceOrientations
Methode des obersten Vollbild-Controllers zurückgegebenen Wert schneidet .
Also habe ich eine Unterklasse erstellt UINavigationController
, meine MainNavigationController
boolesche Eigenschaft angegeben landscapeOK
und diese verwendet, um die zulässigen Ausrichtungen in zurückzugeben supportedInterfaceOrientations
. Dann habe ich in jeder viewWillAppear:
Methode meiner View Controller eine Zeile wie diese
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
um mir MainNavigationController
das gewünschte Verhalten zu sagen .
Hier kommt die Frage: Wenn ich jetzt im Hochformat zu meiner vierten Ansicht navigiere und das Telefon umdrehe, dreht es sich in Querformat. Jetzt drücke ich die Zurück-Taste, um zu meiner dritten Ansicht zurückzukehren, die nur im Hochformat funktionieren soll. Aber es dreht sich nicht zurück. Wie mache ich das?
Ich habe es versucht
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
in der viewWillAppear
Methode meines dritten View Controllers, aber es macht nichts. Ist dies die falsche Methode zum Aufrufen oder vielleicht der falsche Ort zum Aufrufen oder sollte ich das Ganze auf eine völlig andere Art und Weise implementieren?
quelle
Fügen Sie einen CustomNavigationController hinzu
Überschreiben Sie diese Methoden darin:
Fügen Sie nun alle Ausrichtungen in die Liste ein
Fügen Sie im View Controller nur die erforderlichen hinzu:
Diese Methoden überschreiben die Navigationssteuerungsmethoden
quelle
ViewController
im Porträtmodus befinden und meineViewController
im Landschafts- und Porträtmodus. Ich gebe auch Unterstützung in iOS 5.0 und iOS 6.0. Deshalb bin ich verwirrt, um herumzuarbeiten, aber das ist eine großartige Lösung. Ich füge CustomNavigationController zu meinem Root View Controller hinzu und gebe Unterstützung entsprechend meinen Anforderungen. Noch einmal vielen Dank.Nachdem ich jede Antwort in unzähligen ähnlichen Fragen zu SO durchgesehen hatte, funktionierte keine der Antworten für mich, aber sie gaben mir einige Ideen. So habe ich das Problem gelöst:
Stellen Sie zunächst sicher, dass Ihre unterstützten Schnittstellenausrichtungen im Ziel Ihres Projekts alle Ausrichtungen enthalten, die Sie für Ihre rotierende Ansicht benötigen.
Erstellen Sie als Nächstes eine Kategorie von
UINavigationController
(da Apple sagt, dass keine Unterklasse erstellt werden soll):Importieren Sie diese Kategorie und den Ansichts-Controller, den Sie drehen möchten (was ich nennen werde
RotatingViewController
), in Ihren Ansichts-Controller der höchsten Ebene, der Ihren Navigations-Controller enthalten soll. Implementieren Sie in diesem Ansichts-ControllershouldAutorotate
Folgendes. Beachten Sie, dass dies nicht derselbe Ansichtscontroller sein sollte, den Sie drehen möchten.Schließlich
RotatingViewController
implementieren Sie in IhremshouldAutorotate
undsupportedInterfaceOrientations
wie folgt:Der Grund dafür ist, dass iOS 6 dem Root-View-Controller anstelle des Top-View-Controllers die Steuerung der Rotation ermöglicht. Wenn Sie möchten, dass sich die Rotation einer einzelnen Ansicht anders verhält als andere Ansichten im Stapel, müssen Sie einen bestimmten Fall dafür in den Root-Ansichts-Controller schreiben.
quelle
Ich habe nicht genug Ruf, um die Antwort von @ Brian zu kommentieren, daher werde ich meine Notiz hier hinzufügen.
Brian erwähnte, dass iOS6 dem rootViewController die Rotationssteuerung gibt - dies könnte nicht nur ein UINavigationController sein, wie erwähnt, sondern auch ein UITabBarController, der für mich war. Meine Struktur sieht so aus:
Also habe ich die Methoden zuerst in einem benutzerdefinierten UITabBarController, dann in einem benutzerdefinierten UINavigationController und zuletzt in dem spezifischen UIViewController hinzugefügt.
Beispiel aus dem UITabBarController und UINavigationController:
quelle
Ich möchte eine teilweise Antwort auf meine eigene Frage geben. Ich fand die folgende Codezeile, die in der
viewWillAppear
Methode meines dritten verwendet wurdeUIViewController
, um zu funktionieren:Aber ich mag diese Lösung nicht wirklich. Es wird ein Trick verwendet, um einer schreibgeschützten Eigenschaft zuzuweisen, die laut Apple-Dokumentation die physische Ausrichtung des Geräts darstellt. Es ist, als würde man dem iPhone sagen, dass es in der Hand des Benutzers zur richtigen Ausrichtung springen soll.
Ich bin sehr versucht, dies in meiner App zu belassen, da es einfach funktioniert. Aber es fühlt sich nicht richtig an, deshalb möchte ich die Frage für eine saubere Lösung offen lassen.
quelle
Dies verwende ich zur Orientierungsunterstützung in iOS 6.0
quelle
Dies ist ein hoch angesehener Thread. Ich dachte, ich würde hinzufügen, was meiner Meinung nach die einfachste Antwort ist. Dies funktioniert für ios8 und höher
und
Das ist es. Genießen!
Oh, und meine ViewController sind in einen Navigationscontroller eingebettet, den ich in keiner Weise unterklassifizieren oder konfigurieren musste.
quelle
Das funktioniert vielleicht nicht für alle, aber für mich funktioniert es großartig. Anstatt zu implementieren ...
In viewWillAppear in allen meinen Controllern habe ich beschlossen, diesen Prozess innerhalb meiner UINavigationController-Unterklasse zu zentralisieren, indem ich die UINavigationControllerDelegate- Methode überschreibe
navigationController:willShowViewController:animated:
Ich habe festgestellt, dass diese Delegatenmethode nicht aufgerufen wird, wenn eine VC vom Navigationsstapel entfernt wird. Dies war für mich kein Problem, da ich die Back-Funktionalität in meiner UINavigationController-Unterklasse verwalte, damit ich die richtigen Schaltflächen und Aktionen für die Navigationsleiste für bestimmte VCs wie diese festlegen kann ...
So
back
sieht meine Methode aus, um die VC vom Stapel zu entfernen und die entsprechende Rotationseinstellung festzulegen ...Wie Sie sehen, ist im Grunde alles, was passiert, dass ich mir zuerst zwei Eigenschaften einstelle ...
in
navigationController:willShowViewController:animated:
dem bestimmt wird, welche unterstützten Orientierungen innerhalb der VC liegen, die präsentiert werden soll. Beim Poppen einer VC wird meine benutzerdefinierte "back" -Methode aufgerufen, und ich setze dann isLandscapeOK auf das, was über den vorherigen Wert von VCLandscapeOK gespeichert wurde.Wie gesagt, dies funktioniert möglicherweise nicht für alle, aber es funktioniert hervorragend für mich und ich muss mir keine Gedanken über das Hinzufügen von Code zu jedem meiner View-Controller machen. Ich konnte alles zentral in der UINavigationController-Unterklasse halten.
Hoffe das hilft jemandem wie mir. Danke, Jeremy.
quelle
Gehen Sie zu Ihrer Info.plist-Datei und nehmen Sie die Änderung vor
quelle
Sie möchten das Portrait der iOS 6-App nur dann erzwingen, wenn Sie eine der folgenden Methoden zu einer UIViewController-Unterklasse hinzufügen können
quelle
NSUInteger
eine Warnung aus, obwohl es sich um den richtigen var-Typ handelt. Wenn Sie OCD haben, verwenden SieUIInterfaceOrientationMask
stattdessen.Ich wollte, dass alle meine VCs bis auf einen auf Hochformat ausgerichtet sind. Das hat bei mir funktioniert.
Ermitteln Sie im Root-View-Controller die Art des View-Controllers, der sich oben im Fenster befindet, und legen Sie die Ausrichtung der App in der unterstützten Methode InterfaceOrientations entsprechend fest . Zum Beispiel musste meine App nur gedreht werden, wenn sich die Webansicht oben auf dem Stapel befand. Folgendes habe ich in meinem rootVC hinzugefügt:
quelle
[[Utils getAppDelegate] appNavigationController]
. Ich vermute, Utils ist eine Klasse, die Sie haben, aber ich bin ratlos, was Sie darin tun. Jede Hilfe wäre toll!Ich habe nicht genug Ruf, um die @ Ram S-Frage unter @micmdk-Antwort zu beantworten, daher werde ich meine Notiz hier hinzufügen.
Wenn Sie UITabbarController verwenden , versuchen Sie, self.viewControllers.lastObject im Code von @ micmdk wie folgt in self.selectedViewController zu ändern :
quelle
Sie können in allen View Controller-Klassen, die in einer anderen Ausrichtung als der in PLIST Ihrer App definierten angezeigt werden sollen, shouldAutorotate () und supportInterfaceOrientations var implementieren und überschreiben.
In einer nicht trivialen Benutzeroberfläche kann es jedoch zu Problemen beim Hinzufügen in Dutzenden von Klassen kommen, und Sie möchten nicht alle Unterklassen mehrerer allgemeiner Klassen festlegen, die dies unterstützen (MyBaseTableViewController, MyBaseNavigationController und MyBaseTabBarController).
Da Sie diese Methode / var in UIViewController nicht direkt überschreiben können, können Sie dies in seinen Unterklassen tun, die normalerweise Ihre Basisklassen sind, wie UITableViewController, UINavigationController und UITabBarController.
Sie können also einige Erweiterungen implementieren und MyPreciousViewController dennoch so einrichten, dass es in einer anderen Ausrichtung als alle anderen wie dieses Swift 4-Codefragment angezeigt wird:
quelle
Ich habe das gleiche Problem gelöst.
Wenn Sie
UINavigationController
die Ansichts-Controller mit p drücken, müssen Sie die folgenden Methoden festlegen.An der Stelle
LoginViewController
, dieUIViewController
Sie zeigen möchten. In meinem Fall möchte ich dasLoginViewController
imPortrait
Modus andereViewControllers
imlandscape
Modus anzeigen.quelle
Bitte verwenden Sie die folgende Methode, um dieses Problem zu lösen
gib nur die Orientierung zurück, die du willst !!!
quelle