Kann mir bitte jemand den "richtigen" oder "besten" Ansatz für die Arbeit mit Orientierungen der Hoch- und Querformatoberfläche in iOS 8 nennen? Es scheint, dass alle Funktionen, die ich für diesen Zweck verwenden möchte, in iOS 8 veraltet sind, und meine Forschung hat keine klare, elegante Alternative ergeben. Soll ich wirklich die Breite und Höhe betrachten, um selbst festzustellen, ob wir uns im Hoch- oder Querformat befinden?
Wie soll ich beispielsweise in meinem View Controller den folgenden Pseudocode implementieren?
if we are rotating from portrait to landscape then
do portrait things
else if we are rotating from landscape to portrait then
do landscape things
UIViewController
. Siehe den Abschnitt mit dem Titel "Umgang mitAntworten:
Apple empfiehlt die Verwendung von Größenklassen als grobes Maß für den verfügbaren Bildschirmbereich, damit Ihre Benutzeroberfläche das Layout und das Erscheinungsbild erheblich ändern kann. Beachten Sie, dass ein iPad im Hochformat dieselben Größenklassen hat wie im Querformat (normale Breite, normale Höhe). Dies bedeutet, dass Ihre Benutzeroberfläche zwischen den beiden Ausrichtungen mehr oder weniger ähnlich sein sollte.
Der Wechsel von Hoch- zu Querformat in einem iPad ist jedoch so bedeutend, dass Sie möglicherweise kleinere Anpassungen an der Benutzeroberfläche vornehmen müssen, obwohl sich die Größenklassen nicht geändert haben. Da die auf die Schnittstellenorientierung bezogenen Methoden
UIViewController
veraltet sind, empfiehlt Apple nun, die folgende neue MethodeUIViewController
als Ersatz zu implementieren :Toll! Jetzt erhalten Sie Rückrufe, kurz bevor die Rotation beginnt und nachdem sie beendet ist. Aber was ist mit dem tatsächlichen Wissen, ob es sich bei der Rotation um Hoch- oder Querformat handelt?
Apple empfiehlt, Rotation lediglich als Änderung der Größe der übergeordneten Ansicht zu betrachten. Mit anderen Worten, während einer iPad-Rotation von Hoch- zu Querformat können Sie sich das als die Ansicht auf Stammebene vorstellen, die einfach
bounds.size
von{768, 1024}
zu wechselt{1024, 768}
. Wenn Sie dies wissen, sollten Siesize
dieviewWillTransitionToSize:withTransitionCoordinator:
oben beschriebene Methode verwenden, um herauszufinden, ob Sie sich im Hoch- oder Querformat drehen.Wenn Sie eine noch nahtlosere Methode zum Migrieren von Legacy-Code auf die neue iOS 8-Methode verwenden möchten, sollten Sie diese einfache Kategorie in UIView verwenden, mit der Sie anhand ihrer Funktion bestimmen können, ob eine Ansicht "Hochformat" oder "Querformat" ist Größe.
Um es noch einmal zusammenzufassen:
viewWillTransitionToSize:withTransitionCoordinator:
Rückruf in UIViewController.statusBarOrientation
Eigenschaft, die im Grunde genommen eine Eigenschaft auf Geräteebene ist, um zu bestimmen, ob eine Ansicht für "Hochformat" oder "Querformat" angeordnet werden soll. Die Ausrichtung der Statusleiste sollte nur von Code verwendet werden, der sich mit Dingen befasst,UIWindow
die sich tatsächlich auf der Root-Ebene der App befinden.quelle
UIViewControllerTransitionCoordinator
ein Albtraum ist :-(viewdidlayoutsubviews
dann? Ich dachte, esviewdidlayoutsubviews
wird verwendet, um gebundene Änderungen aufgrund von Rotation zu erfassen. Können Sie das näher erläutern?Basierend auf der sehr detaillierten (und akzeptierten) Antwort von smileyborg ist hier eine Anpassung mit Swift 3:
Und bei der
UICollectionViewDelegateFlowLayout
Umsetzung,quelle
Ich benutze einfach das Benachrichtigungscenter:
Fügen Sie eine Orientierungsvariable hinzu (wird am Ende erklärt)
Benachrichtigung hinzufügen, wenn Ansicht angezeigt wird
Benachrichtigung entfernen, wenn die Ansicht nicht mehr angezeigt wird
Ruft die aktuelle Ausrichtung ab, wenn eine Benachrichtigung ausgelöst wird
Überprüft die Ausrichtung (Hoch- / Querformat) und behandelt Ereignisse
Der Grund, warum ich eine Orientierungsvariable hinzufüge, ist, dass beim Testen auf einem physischen Gerät die Orientierungsbenachrichtigung bei jeder kleinen Bewegung im Gerät aufgerufen wird und nicht nur, wenn es sich dreht. Durch Hinzufügen der Anweisungen var und if wird der Code nur aufgerufen, wenn in die entgegengesetzte Ausrichtung gewechselt wurde.
quelle
super
vonviewDidAppear
undviewWillDisappear
sollte genannt werdenAus Sicht der Benutzeroberfläche glaube ich, dass die Verwendung von Größenklassen der von Apple empfohlene Ansatz für den Umgang mit Schnittstellen in verschiedenen Ausrichtungen, Größen und Maßstäben ist.
Siehe Abschnitt: Merkmale Beschreiben Sie die Größenklasse und den Maßstab einer Schnittstelle hier: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html
Dies ist auch ein guter Artikel: https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/
EDIT Aktualisierter Link: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Bildnachweis: Koen)
quelle