Da hat meine App Unterstützung für alle Orientierung bekommen. Ich möchte nur den Hochformatmodus für einen bestimmten UIViewController sperren.
Angenommen, es handelt sich um eine Anwendung mit Registerkarten. Wenn die Anmeldeansicht modal angezeigt wird, möchte ich nur, dass die Anmeldeansicht nur im Hochformat angezeigt wird, unabhängig davon, wie der Benutzer das Gerät dreht oder wie die aktuelle Geräteausrichtung sein wird
swift
uiviewcontroller
portrait
device-orientation
Thiha Aung
quelle
quelle
Antworten:
Wenn Sie eine komplizierte Ansichtshierarchie haben, wie z. B. mehrere Navigationscontroller und / oder Registerkartenansicht-Controller, kann es ziemlich chaotisch werden.
Bei dieser Implementierung müssen die einzelnen Ansichtscontroller festlegen, wann sie Ausrichtungen sperren möchten, anstatt sich darauf zu verlassen, dass der App-Delegierte sie durch Durchlaufen von Unteransichten findet.
Schnelle 3 & 4
In AppDelegate:
In einer anderen globalen Struktur- oder Hilfsklasse habe ich hier AppUtility erstellt:
Dann möchten Sie im gewünschten ViewController die Ausrichtung sperren:
Wenn iPad oder Universal App
Stellen Sie sicher, dass unter Zieleinstellungen -> Allgemein -> Bereitstellungsinformationen die Option "Vollbild erforderlich" aktiviert ist.
supportedInterfaceOrientationsFor
Der Delegat wird nicht angerufen, wenn dies nicht aktiviert ist.quelle
Requires full screen
ist, wird verhindert, dass die App für Slide Over und Split View verfügbar ist. Siehe Übernahme von Multitasking-Verbesserungen auf dem iPad durch Apple. Ich habe eine Antwort, für die keine Aktivierung erforderlich istRequires full screen
Swift 4
AppDelegate
Ihr ViewController Folgende Zeile hinzufügen , wenn Sie nur Hochformat benötigen. Sie müssen dies auf alle ViewController anwenden, die den Porträtmodus anzeigen müssen.
Dadurch wird die Bildschirmausrichtung für andere Viewcontroller entsprechend der physischen Ausrichtung des Geräts vorgenommen.
quelle
func application
innerhalb des App-Delegaten durch diese Funktionfunc application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
Schnelle 3 & 4
supportedInterfaceOrientations
Legen Sie die Eigenschaft bestimmter UIViewController wie folgt fest:AKTUALISIEREN
Diese Lösung funktioniert nur , wenn Ihr
viewController
ist nicht eingebettet inUINavigationController
, weil die Orientierung erbt von Eltern Viewcontroller.In diesem Fall können Sie eine Unterklasse von erstellen
UINavigationViewController
und diese Eigenschaften festlegen.quelle
Fügen Sie diesen Code hinzu, um das Porträt zu erzwingen und zu sperren:
Stellen Sie in Ihrem AppDelegate supportInterfaceOrientationsForWindow auf die Ausrichtungen ein, die die gesamte Anwendung unterstützen soll:
quelle
Dies ist eine generische Lösung für Ihr Problem und andere verwandte Probleme.
1. Erstellen Sie die Hilfsklasse UIHelper und wenden Sie die folgenden Methoden an:
2. Erstellen Sie ein Protokoll mit Ihrem Wunschverhalten, denn Ihr spezieller Fall ist Porträt.
ProtokollorientierungIsOnlyPortrait {}
Hinweis: Wenn Sie möchten, fügen Sie es oben in der UIHelper-Klasse hinzu.
3. Erweitern Sie Ihren View Controller
In deinem Fall:
4. Fügen Sie in der App-Delegatenklasse die folgende Methode hinzu:
Schlussbemerkungen:
quelle
Eine Reihe großartiger Antworten in diesem Thread, aber keine entsprach ganz meinen Bedürfnissen. Ich habe eine App mit Registerkarten mit Navigationssteuerungen in jeder Registerkarte, und eine Ansicht musste gedreht werden, während die anderen im Hochformat gesperrt werden mussten. Der Navigationscontroller hat aus irgendeinem Grund die Größe seiner Unteransichten nicht richtig geändert. Durch Kombinieren mit dieser Antwort wurde eine Lösung (in Swift 3) gefunden , und die Layoutprobleme verschwanden. Erstellen Sie die Struktur wie von @bmjohns vorgeschlagen:
Dann Unterklasse UITabBarController:
Vergessen Sie nicht, die Klasse des TabBarControllers im Storyboard in die neu erstellte Unterklasse zu ändern.
quelle
Versuchen Sie dies für eine neue Version von Swift
quelle
Hier ist eine einfache Methode, die für mich mit Swift 4.2 (iOS 12.2)
UIViewController
funktioniert. Fügen Sie diese in eine Datei ein, für die Sie sollten deaktivieren sollten.Der
.portrait
Teil gibt an, in welcher Ausrichtung (en) Sie bleiben sollen. Sie können dies nach Belieben ändern. Zur Wahl stehen:.portrait
,.all
,.allButUpsideDown
,.landscape
,.landscapeLeft
,.landscapeRight
,.portraitUpsideDown
.quelle
So legen Sie die Querformatausrichtung auf alle Ansichten Ihrer App fest und lassen nur eine Ansicht auf Alle Ausrichtungen zu (um beispielsweise eine Kamerarolle hinzufügen zu können):
In AppDelegate.swift:
In: didFinishLaunchingWithOptions
An anderer Stelle in AppDelegate.swift:
Dann in der Ansicht, die zu der übergeht, möchten Sie in der Lage sein, alle Orientierungen zu haben:
Als letztes kreuzen Sie die Geräteorientierung an: - Hochformat - Querformat links - Querformat rechts
quelle
Erstellen Sie eine neue Erweiterung mit
quelle
bmjohns -> Du bist mein Lebensretter. Dies ist die einzige funktionierende Lösung (mit der AppUtility-Struktur)
Ich habe diese Klasse erstellt:
und befolgte Ihre Anweisungen, und alles funktioniert perfekt für Swift 3 -> xcode Version 8.2.1
quelle
Ab iOS 10 und 11 unterstützt das iPad Slide Over und Split View. Um eine App in Slide Over und Split View zu aktivieren,
Requires full screen
muss das Kontrollkästchen deaktiviert sein. Das bedeutet, dass die akzeptierte Antwort nicht verwendet werden kann, wenn die App Slide Over und Split View unterstützen möchte. Weitere Informationen zu Apples Einführung von Multitasking-Verbesserungen auf dem iPad finden Sie hier .Ich habe eine Lösung, mit der (1) das Kontrollkästchen deaktiviert
Requires full screen
, (2) nur eine Funktion implementiert werden kannappDelegate
(insbesondere, wenn Sie die Controller für die Zielansicht nicht ändern möchten / können) und (3) rekursive Aufrufe vermieden werden. Keine Notwendigkeit für Helferklasse oder Erweiterungen.appDelegate.swift (Swift 4)
Bearbeiten
@bmjohns wies darauf hin, dass diese Funktion auf dem iPad nicht aufgerufen wird. Ich habe überprüft und ja, es wurde nicht aufgerufen. Also habe ich ein bisschen mehr getestet und einige Fakten herausgefunden:
Requires full screen
weil ich Slide Over und Slide View auf dem iPad aktivieren möchte. Dazu muss die App alle 4 Orientierungen für das iPad in Info.plist unterstützen :Supported interface orientations (iPad)
.Meine App funktioniert genauso wie Facebook: Auf dem iPhone ist sie meistens an Hochformat gebunden. Wenn Sie das Bild im Vollbildmodus anzeigen, können Benutzer das Querformat drehen, um eine bessere Ansicht zu erhalten. Auf dem iPad können Benutzer in beliebigen Ansichts-Controllern in jede beliebige Ausrichtung drehen. Die App sieht also gut aus, wenn das iPad auf dem Smart Cover steht (Querformat links).
Damit das iPad
application(_:supportedInterfaceOrientationsFor)
in Info.plist anruft, behalten Sie nur das Porträt für das iPad bei. Die App verliert die Fähigkeit Slide Over + Split View. Sie können die Ausrichtung für jeden View Controller jedoch an nur einer Stelle sperren oder entsperren, ohne die ViewController-Klasse ändern zu müssen.Schließlich wird diese Funktion im Lebenszyklus des View Controllers aufgerufen, wenn die Ansicht angezeigt / entfernt wird. Wenn Ihre App die Ausrichtung zu einem anderen Zeitpunkt sperren / entsperren / ändern muss, funktioniert sie möglicherweise nicht
quelle
Tatsächlich getestete Lösung hierfür. In meinem Beispiel muss sich meine gesamte App im Hochformat befinden, aber nur die Ausrichtung eines Bildschirms sollte sich im Querformat befinden.
Code in AppDelegate wie oben beschrieben.
Notieren Sie sich dann diesen Code, bevor Ihr Querformat-Ansichtscontroller angezeigt / gedrückt wird.
Notieren Sie sich dann diesen Code im aktuellen Viewcontroller (für Querformat)
quelle
Ich habe ein wenig experimentiert und es geschafft, eine saubere Lösung für dieses Problem zu finden. Der Ansatz basiert auf dem View-Tagging über view-> tag
Weisen Sie im Ziel-ViewController das Tag wie im folgenden Codebeispiel der Stammansicht zu:
Und schließlich überprüfen Sie in AppDelegate.swift, ob die aktuell angezeigte Ansicht die ist, die wir markiert haben:
Dieser Ansatz wurde mit meinem Simulator getestet und scheint gut zu funktionieren.
Hinweis: Die markierte Ansicht wird auch gefunden, wenn sich die aktuelle MVC mit einem untergeordneten ViewController im Navigationsstapel überschneidet.
quelle
Vielen Dank an die Antwort von @ bmjohn oben. Hier ist ein funktionierendes Xamarin / C # -Version des Codes dieser Antwort, um anderen die Zeit der Transkription zu ersparen:
AppDelegate.cs
Static OrientationUtility.cs Klasse:
Controller anzeigen:
quelle
Beste Lösung zum Sperren und Ändern der Ausrichtung im Hoch- und Querformat:
Sehen Sie sich dieses Video auf YouTube an:
https://m.youtube.com/watch?v=4vRrHdBowyo
Dieses Tutorial ist am besten und einfach.
oder verwenden Sie den folgenden Code:
Siehe dieses Bild
// 1- Im zweiten Viewcontroller setzen wir LandscapeLeft und im ersten Viewcontroller setzen wir Portrat:
// 2- Wenn Sie NavigationController verwenden, sollten Sie eine Erweiterung hinzufügen
quelle