Vor iOS 8 haben wir den folgenden Code in Verbindung mit unterstützten Delegate-Methoden von InterfaceOrientations und shouldAutoRotate verwendet, um die App-Ausrichtung auf eine bestimmte Ausrichtung zu erzwingen. Ich habe das folgende Code-Snippet verwendet, um die App programmgesteuert in die gewünschte Ausrichtung zu drehen. Erstens ändere ich die Ausrichtung der Statusleiste. Wenn Sie dann nur eine modale Ansicht präsentieren und sofort schließen, wird die Ansicht in die gewünschte Ausrichtung gedreht.
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Dies schlägt jedoch in iOS 8 fehl. Außerdem habe ich einige Antworten im Stapelüberlauf gesehen, bei denen vorgeschlagen wurde, diesen Ansatz ab iOS 8 immer zu vermeiden.
Genauer gesagt ist meine Bewerbung eine universelle Art der Bewerbung. Insgesamt gibt es drei Controller.
First View-Controller - Er sollte alle Ausrichtungen auf dem iPad und nur Hochformat (Home-Taste gedrückt) auf dem iPhone unterstützen.
Second View-Controller - Er sollte unter allen Bedingungen nur Landschaftsrechte unterstützen
Third View Controller - Er sollte unter allen Bedingungen nur Landschaftsrechte unterstützen
Wir verwenden den Navigationscontroller für die Seitennavigation. Vom ersten Ansichtscontroller aus schieben wir auf Knopfdruck den zweiten auf den Stapel. Wenn der zweite Ansichts-Controller unabhängig von der Geräteorientierung eintrifft, sollte die App nur im Querformat richtig einrasten.
Unten ist meine shouldAutorotate
und supportedInterfaceOrientations
Methoden in der zweiten und dritten Ansicht Controller.
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeRight;
}
-(BOOL)shouldAutorotate {
return NO;
}
Gibt es eine Lösung für diese oder eine bessere Möglichkeit, einen View Controller in einer bestimmten Ausrichtung für iOS 8 zu sperren? Bitte helfen Sie !!
quelle
Antworten:
Für iOS 7 - 10:
Ziel c:
Swift 3:
Rufen Sie es einfach im
- viewDidAppear:
vorgestellten View Controller auf.quelle
[UIView setAnimationsEnabled:NO];
einviewWillAppear
und[UIView setAnimationsEnabled:YES];
ausviewDidAppear
, im Zusammenhang mit: stackoverflow.com/a/6292506/88597[UINavigationController attemptRotationToDeviceOrientation];
Die Orientierungsrotation ist etwas komplizierter, wenn Sie sich in einem
UINavigationController
oder befindenUITabBarController
. Das Problem besteht darin, dass, wenn ein Ansichts-Controller in einen dieser Controller eingebettet ist, der Navigations- oder Registerkarten-Controller Vorrang hat und Entscheidungen über Autorotation und unterstützte Ausrichtungen trifft.Ich verwende die folgenden 2 Erweiterungen für UINavigationController und UITabBarController, damit View-Controller, die in einen dieser Controller eingebettet sind, die Entscheidungen treffen können.
Geben Sie View Controllern die Kraft!
Swift 2.3
Swift 3
Jetzt können Sie die
supportedInterfaceOrientations
Methode überschreiben odershouldAutoRotate
den View Controller, den Sie sperren möchten, überschreiben. Andernfalls können Sie die Überschreibungen in anderen View Controllern weglassen, die das in der Liste Ihrer App angegebene Standardausrichtungsverhalten erben möchtenDrehung deaktivieren
Auf spezifische Ausrichtung festlegen
Theoretisch sollte dies für alle komplexen View Controller-Hierarchien funktionieren, aber ich habe ein Problem mit UITabBarController festgestellt. Aus irgendeinem Grund möchte es einen Standardausrichtungswert verwenden. Lesen Sie den folgenden Blog-Beitrag, wenn Sie erfahren möchten, wie Sie einige der Probleme umgehen können:
Bildschirmdrehung sperren
quelle
Das hat bei mir funktioniert:
https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation
Rufen Sie es in Ihrer viewDidAppear: -Methode auf.
quelle
Ich habe festgestellt, dass Sie überschreiben können, wenn es sich um einen präsentierten Ansichts-Controller handelt
preferredInterfaceOrientationForPresentation
Schnell:
quelle
So funktioniert es für mich in Swift 2 iOS 8.x:
PS (diese Methode erfordert nicht das Überschreiben von Orientierungsfunktionen wie shouldautorotate auf jedem viewController, nur eine Methode auf AppDelegate)
Aktivieren Sie das Kontrollkästchen "Vollbild erforderlich" in den allgemeinen Projektinformationen.
Machen Sie also auf AppDelegate.swift eine Variable:
Also, setzen Sie auch diese Funktion:
In jeder Klasse in Ihrem Projekt können Sie diese Variable in viewWillAppear festlegen:
Wenn Sie eine Auswahl basierend auf dem Gerätetyp treffen müssen, können Sie Folgendes tun:
quelle
Zuallererst - dies ist im Allgemeinen eine schlechte Idee, da etwas mit Ihrer App-Architektur nicht stimmt. In diesem Fall
sh..t happens
können Sie jedoch versuchen, Folgendes zu erstellen:Als in
AppDelegate
Und wann immer Sie die Ausrichtung ändern möchten, gehen Sie wie folgt vor:
Hinweis: Manchmal wird das Gerät möglicherweise nicht von einem solchen Anruf aktualisiert. Daher müssen Sie möglicherweise die folgenden Schritte ausführen
Das ist alles
quelle
Dies sollte ab iOS 6 funktionieren, aber ich habe es nur unter iOS 8 getestet. Unterklassen
UINavigationController
und überschreiben Sie die folgenden Methoden:Oder fragen Sie den Controller für sichtbare Ansichten
und implementieren Sie die Methoden dort.
quelle
Dies ist ein Feedback zu Kommentaren in Sid Shahs Antwort zum Deaktivieren von Animationen mit:
Code:
quelle
Wenn Sie navigationViewController verwenden, sollten Sie hierfür eine eigene Oberklasse erstellen und überschreiben:
Dadurch wird die Drehung in SecondViewController deaktiviert. Wenn Sie jedoch Ihren SecondViewController drücken, während sich Ihr Gerät im Hochformat befindet, wird Ihr SecondViewController im Hochformat angezeigt .
Angenommen, Sie verwenden ein Storyboard. Sie müssen einen manuellen Übergang ( How to ) und in Ihrer "onClick" -Methode erstellen:
Dadurch wird die Ausrichtung im Querformat erzwungen, bevor die Superklasse die Autorotate-Funktion deaktiviert.
quelle
Da
Xcode 8
die Methoden in Eigenschaften konvertiert werden, funktioniert folgendes mitSwift
:quelle
portrait
Modus sein, egal wie die Ausrichtung auf dem iPad ist. Mit dershouldAutorotate
Rückgabe von true habe ich das erreicht.Ich habe viele Lösungen ausprobiert, aber die, für die ich gearbeitet habe, ist die folgende:
Es ist nicht erforderlich, die
info.plist
in ios 8 und 9 zu bearbeiten .Mögliche Orientierungen aus der Apple-Dokumentation :
quelle
Die Kombination von Sids- und Koreys-Antworten hat bei mir funktioniert.
Erweiterung des Navigationscontrollers:
Deaktivieren Sie dann die Drehung in der Einzelansicht
Und vor dem Übergang in die richtige Ausrichtung drehen
quelle
Die Top-Lösung oben:
hat bei mir nicht funktioniert, als ich es in viewDidAppear des vorgestellten View Controllers aufgerufen habe. Es hat jedoch funktioniert, als ich es in prepareForSegue im Presenting View Controller aufgerufen habe.
(Entschuldigung, nicht genug Reputationspunkte, um diese Lösung zu kommentieren, also musste ich sie so hinzufügen)
quelle
[iOS9 +] Wenn jemand den ganzen Weg nach unten gezogen hat, da keine der oben genannten Lösungen funktioniert hat, und wenn Sie die Ansicht präsentieren, die Sie nach Segue ändern möchten, sollten Sie dies überprüfen.
Überprüfen Sie den Präsentationstyp Ihres Segues. Meins war "über dem aktuellen Kontext". Als ich es in Vollbild geändert habe, hat es funktioniert.
Dank @GabLeRoux habe ich diese Lösung gefunden.
quelle
Meine Anforderungen sind
AVPlayerViewController
diese Option, um Videos abzuspielenWenn es sich bei der Wiedergabe eines Videos um eine Landschaft handelt, kann der Bildschirm die Landschaft nach rechts und die Landschaft nach links drehen. Wenn es sich um ein Porträt handelt, sperren Sie die Ansicht nur im Hochformat.
Definieren Sie zunächst
supportedInterfaceOrientationsForWindow
inAppDelegate.swift
Zweitens definieren Sie in Ihrem Hauptansichts-Controller die folgenden Funktionen
Dann müssen Sie eine Unterklasse erstellen
AVPlayerViewController
Überschreiben Sie diese drei Funktionen in
MyPlayerViewController.swift
Da der Benutzer die Gerätelandschaft möglicherweise nach links oder rechts drehen kann, müssen wir die automatische Drehung auf true setzen
Erstellen Sie
MyPlayerViewController
abschließend eine Instanz in Ihrem Ansichts-Controller und legen Sie den Wert für die Eigenschaftsgröße fest.Initiieren Sie Ihren Player mit dem richtigen
videoUrl
und weisen Sie Ihren Player dann zuplayerViewController
. Viel Spaß beim Codieren!quelle
quelle
Es scheint immer noch eine Debatte darüber zu geben, wie diese Aufgabe am besten erfüllt werden kann, daher dachte ich, ich würde meinen (Arbeits-) Ansatz teilen. Fügen Sie Ihrer
UIViewController
Implementierung den folgenden Code hinzu :In diesem Beispiel müssen Sie in Ihren Projekteinstellungen (oder direkt in
info.plist
) auch die zulässigen Geräteorientierungen auf "Querformat links" setzen . Ändern Sie einfach die spezifische Ausrichtung, die Sie erzwingen möchten, wenn Sie etwas anderes als möchtenLandscapeLeft.
Der Schlüssel für mich war der
attemptRotationToDeviceOrientation
AnrufviewWillAppear
- ohne das würde sich die Ansicht nicht richtig drehen, ohne das Gerät physisch zu drehen.quelle
Nach der Antwort von Korey Hinton
Swift 2.2:
Drehung deaktivieren
Auf spezifische Ausrichtung festlegen
quelle
Ich habe hier ein paar Lösungen ausprobiert und es ist wichtig zu verstehen, dass es der Root-View-Controller ist, der bestimmt, ob er sich dreht oder nicht.
Ich habe das folgende Objective-C- Projekt erstellt: github.com/GabLeRoux/RotationLockInTabbedViewChild mit einem Arbeitsbeispiel für ein Projekt, bei dem eine untergeordnete
TabbedViewController
Ansicht gedreht werden darf und die andere untergeordnete Ansicht im Hochformat gesperrt ist.Es ist nicht perfekt, aber es funktioniert und die gleiche Idee sollte für andere Arten von Root-Ansichten wie funktionieren
NavigationViewController
. :) :)quelle
Laut der von @ sid-sha gezeigten Lösung müssen Sie alles in die
viewDidAppear:
Methode einfügen, sonst werden Sie nichtdidRotateFromInterfaceOrientation:
gefeuert, also so etwas wie:quelle
Meine Lösung
In
AppDelegate
:XXViewController
ist der ViewController, den Sie im Querformat unterstützen möchten.Dann würde die Lösung von Sunny Shah in
XXViewController
jeder iOS-Version funktionieren :Dies ist die Dienstprogrammfunktion, um den obersten ViewController zu finden.
quelle
Verwenden Sie diese Option, um die Ausrichtung des Ansichtscontrollers zu sperren, der unter IOS 9 getestet wurde:
// Ausrichtung auf Querformat rechts sperren
quelle
Ich habe das gleiche Problem und verschwende so viel Zeit dafür. Jetzt habe ich meine Lösung. Meine App-Einstellung unterstützt nur Hochformat. Einige Bildschirme in meiner App benötigen jedoch nur Querformat. Ich behebe dies, indem ich eine Variable isShouldRotate bei AppDelegate habe . Und die Funktion bei AppDelegate :
Und schließlich, wenn ein ViewControllerA einen Landschaftsstatus benötigt. Genau das tun: vor Push / present zu ViewControllerA assign isShouldRotate zu wahren . Vergessen Sie nicht, wenn Pop / Entlassen , das der Controller zuweist , bei viewWillDisappear isShouldRotate auf false ist .
quelle
Für mich musste der VC der obersten Ebene die Orientierungsüberschreibungen implementieren. Die Verwendung von VCs im Stack hat keine Auswirkung, wenn die oberste VC nicht implementiert wird.
Im Wesentlichen in meinen Tests wird nur VC-Main angehört.
quelle
Es sieht so aus, als ob selbst du hier so viele Antworten hast, dass mir niemand gereicht hat. Ich wollte die Orientierung erzwingen und dann beim
[UIViewController attemptRotationToDeviceOrientation];
Zurückkehren zur Geräteorientierung zurückkehren, funktionierte aber einfach nicht. Was das Ganze auch kompliziert gemacht hat, ist, dass ich shouldAutorotate basierend auf einer Antwort zu false hinzugefügt habe und nicht die gewünschten Effekte erzielen konnte, um in allen Szenarien korrekt zurückzudrehen.Das habe ich also getan:
Bevor Sie den Controller in seinem Init-Konstruktor aufrufen, gehen Sie wie folgt vor:
Also speichere ich die letzte Geräteorientierung und registriere mich für das Orientierungsänderungsereignis. Ein Orientierungsänderungsereignis ist einfach:
Und auf den ersten Blick zwinge ich einfach zu jeder Orientierung zurück, die ich als userOreintation habe:
Und das muss auch da sein:
Und auch der Navigationscontroller muss an shouldAutorotate delegieren undInterfaceOrientations unterstützen, aber das glauben die meisten Leute bereits.
PS: Tut mir leid, ich verwende einige Erweiterungen und Basisklassen, aber Namen sind ziemlich aussagekräftig, so dass das Konzept verständlich ist und noch mehr Erweiterungen ergibt, da es jetzt nicht zu hübsch ist.
quelle