Ich möchte der Einzelbildansicht zwei Bilder hinzufügen (dh für ein Bild im Querformat und für ein anderes Bild im Hochformat), aber ich weiß nicht, wie ich Orientierungsänderungen mit schnellen Sprachen erkennen kann.
Ich habe diese Antwort versucht, aber es wird nur ein Bild aufgenommen
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("Landscape")
} else {
print("Portrait")
}
}
Ich bin neu in der iOS-Entwicklung, jeder Rat wäre sehr dankbar!
Antworten:
quelle
viewWillTransition
beim Unterklassen nicht überschreiben kannUIView
?.isFlat
. Wenn Sie nur fangen wollen,portrait
schlage ich vor, dass Sie die else-Klausel in ändernelse if UIDevice.current.orientation.isPortrait
. Hinweis:.isFlat
Kann sowohl im Hoch- als auch im Querformat auftreten. Mit nur else {} wird es dort immer standardmäßig verwendet (auch wenn es sich um eine flache Landschaft handelt).Mit NotificationCenter und UIDevice ‚s
beginGeneratingDeviceOrientationNotifications
Swift 4.2+
Swift 3
quelle
viewWillTransition:
erwartet wird, dass die Änderung während der Verwendung eintreten wird,UIDeviceOrientationDidChange
wird sie aufgerufen, sobald die Änderung abgeschlossen ist.shouldAutorotate
istfalse
. Dies ist praktisch für Bildschirme wie den Hauptbildschirm der Kamera-App. Die Ausrichtung ist gesperrt, die Tasten können sich jedoch drehen.Swift 3 Oben Code aktualisiert:
quelle
⚠️Geräteausrichtung! = Schnittstellenausrichtung⚠️
Swift 5. * iOS13 und niedriger
Sie sollten wirklich einen Unterschied machen zwischen:
Es gibt viele Szenarien, in denen diese beiden Werte nicht übereinstimmen, z.
In den meisten Fällen möchten Sie die Schnittstellenausrichtung verwenden und können diese über das Fenster abrufen:
Wenn Sie auch <iOS 13 (z. B. iOS 12) unterstützen möchten, gehen Sie wie folgt vor:
Jetzt müssen Sie definieren, wo auf die Ausrichtung der Fensterschnittstellenausrichtung reagiert werden soll. Es gibt mehrere Möglichkeiten, dies zu tun, aber die optimale Lösung besteht darin, dies innerhalb zu tun
willTransition(to newCollection: UITraitCollection
.Diese geerbte UIViewController-Methode, die überschrieben werden kann, wird jedes Mal ausgelöst, wenn die Ausrichtung der Benutzeroberfläche geändert wird. Folglich können Sie alle Ihre Änderungen in letzterem vornehmen.
Hier ist ein Lösungsbeispiel :
Durch die Implementierung dieser Methode können Sie dann auf jede Änderung der Ausrichtung Ihrer Benutzeroberfläche reagieren. Beachten Sie jedoch, dass es beim Öffnen der App nicht ausgelöst wird, sodass Sie Ihre Benutzeroberfläche auch manuell aktualisieren müssen
viewWillAppear()
.Ich habe ein Beispielprojekt erstellt, das den Unterschied zwischen Geräteorientierung und Schnittstellenorientierung unterstreicht. Darüber hinaus hilft es Ihnen, das unterschiedliche Verhalten zu verstehen, je nachdem, für welchen Lebenszyklusschritt Sie Ihre Benutzeroberfläche aktualisieren möchten.
Sie können das folgende Repository klonen und ausführen: https://github.com/wjosset/ReactToOrientation
quelle
func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
funktionierte jedoch nicht. Ich habe es mit funktionieren lassenfunc viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
.Swift 4+: Ich habe dies für das Design von Softtastaturen verwendet, und aus irgendeinem Grund hat
UIDevice.current.orientation.isLandscape
mir die Methode immer wieder gesagtPortrait
, dass dies der Fall ist. Deshalb habe ich stattdessen Folgendes verwendet:quelle
size
Parameter, der in die oben beschriebene Methode viewWillTransitionToSize: withCoordinator: eingefügt wird. Dies gibt die genaue Größe wieder, die Ihre Ansicht nach dem Übergang haben wird.Swift 4.2, RxSwift
Wenn wir collectionView neu laden müssen.
Swift 4, RxSwift
Wenn wir collectionView neu laden müssen.
quelle
Wenn Sie die Swift-Version> = 3.0 verwenden, müssen Sie einige Code-Updates anwenden, wie andere bereits gesagt haben. Vergiss nur nicht, super anzurufen:
Wenn Sie eine StackView für Ihre Bilder verwenden möchten, können Sie Folgendes tun:
Wenn Sie Interface Builder verwenden, vergessen Sie nicht, die benutzerdefinierte Klasse für dieses UIStackView-Objekt im Abschnitt Identity Inspector im rechten Bereich auszuwählen. Erstellen Sie dann einfach (auch über Interface Builder) den IBOutlet-Verweis auf die benutzerdefinierte UIStackView-Instanz:
Nehmen Sie die Idee und passen Sie sie an Ihre Bedürfnisse an. Hoffe das kann dir helfen!
quelle
Swift 4
Ich hatte einige kleinere Probleme beim Aktualisieren der ViewController-Ansicht mit
UIDevice.current.orientation
, z. B. das Aktualisieren von Einschränkungen von Tabellenansichtszellen während der Drehung oder das Animieren von Unteransichten.Anstelle der oben genannten Methoden vergleiche ich derzeit die Übergangsgröße mit der Ansichtsgröße des Ansichtscontrollers. Dies scheint der richtige Weg zu sein, da man an dieser Stelle im Code Zugriff auf beide hat:
Ausgabe auf einem iPhone 6:
quelle
Ich glaube, die richtige Antwort ist tatsächlich eine Kombination beider Ansätze:
viewWIllTransition(toSize:)
undNotificationCenter
'sUIDeviceOrientationDidChange
.viewWillTransition(toSize:)
benachrichtigt Sie vor dem Übergang.NotificationCenter
UIDeviceOrientationDidChange
benachrichtigt Sie nach .Du musst sehr vorsichtig sein. Beispielsweise in ,
UISplitViewController
wenn die Vorrichtung rotiert in bestimmte Orientierungen, dieDetailViewController
bekommen den tauchte offUISplitViewController
‚s -viewcontrollers
Array und Aufschieben auf den MasterUINavigationController
. Wenn Sie vor Abschluss der Drehung nach dem Detailansichts-Controller suchen, ist dieser möglicherweise nicht vorhanden und stürzt ab.quelle
Alle vorherigen Beiträge sind in Ordnung, aber ein kleiner Hinweis:
a) Wenn die Ausrichtung in plist festgelegt ist, nur im Hochformat oder Beispiel, werden Sie nicht über viewWillTransition benachrichtigt
b) Wenn wir trotzdem wissen müssen, ob der Benutzer das Gerät gedreht hat (zum Beispiel ein Spiel oder ähnliches), können wir nur Folgendes verwenden:
getestet auf Xcode8, iOS11
quelle
Um die richtige Ausrichtung beim Start der App zu erhalten , müssen Sie diese einchecken
viewDidLayoutSubviews()
. Andere hier beschriebene Methoden funktionieren nicht.Hier ist ein Beispiel, wie es geht:
Dies funktioniert immer beim ersten Start der App und beim Drehen, während die App ausgeführt wird .
quelle
Sie können verwenden
viewWillTransition(to:with:)
und tippenanimate(alongsideTransition:completion:)
, um die Ausrichtung der Benutzeroberfläche zu erhalten, nachdem der Übergang abgeschlossen ist. Sie müssen lediglich ein ähnliches Protokoll definieren und implementieren, um das Ereignis zu nutzen. Beachten Sie, dass dieser Code für ein SpriteKit-Spiel verwendet wurde und Ihre spezifische Implementierung abweichen kann.Sie können in diesen Funktionen Haltepunkte setzen und beobachten, dass diese
interfaceOrientationChanged(to orientation: UIInterfaceOrientation)
immerviewWillTransition(to size: CGSize)
mit der aktualisierten Ausrichtung aufgerufen werden .quelle
Eine andere Möglichkeit, Geräteorientierungen zu erkennen, ist die Funktion traitCollectionDidChange (_ :). Das System ruft diese Methode auf, wenn sich die iOS-Schnittstellenumgebung ändert.
Darüber hinaus können Sie die Funktion willTransition (to: with :) (die vor traitCollectionDidChange (_ :) aufgerufen wird) verwenden, um Informationen unmittelbar vor dem Anwenden der Ausrichtung abzurufen.
quelle