Quelqu'un peut-il me dire la «bonne» ou «meilleure» approche pour travailler avec les orientations d'interface portrait et paysage dans iOS 8? Il semble que toutes les fonctions que je souhaite utiliser à cette fin soient obsolètes dans iOS 8, et mes recherches n'ont révélé aucune alternative claire et élégante. Suis-je vraiment censé regarder la largeur et la hauteur pour déterminer moi-même si nous sommes en mode portrait ou paysage?
Par exemple, dans mon contrôleur de vue, comment dois-je implémenter le pseudocode suivant?
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
. Consultez la section intitulée «Gestion des rotations de vues». Elle explique ce que vous devez faire.Réponses:
Apple recommande d'utiliser des classes de taille comme une mesure grossière de l'espace disponible sur l'écran, afin que votre interface utilisateur puisse modifier considérablement sa disposition et son apparence. Considérez qu'un iPad en mode portrait a les mêmes classes de taille qu'en mode paysage (largeur régulière, hauteur régulière). Cela signifie que votre interface utilisateur doit être plus ou moins similaire entre les deux orientations.
Cependant, le passage du portrait au paysage dans un iPad est suffisamment important pour que vous deviez peut-être apporter quelques ajustements plus petits à l'interface utilisateur, même si les classes de taille n'ont pas changé. Étant donné que les méthodes liées à l'orientation de l'interface sur
UIViewController
sont obsolètes, Apple recommande désormais de mettre en œuvre la nouvelle méthode suivante enUIViewController
remplacement:Génial! Vous recevez désormais des rappels juste avant le début de la rotation et après la fin. Mais qu'en est-il de savoir si la rotation est en portrait ou en paysage?
Apple recommande de considérer la rotation comme un simple changement de taille de la vue parent. En d'autres termes, lors d'une rotation de l'iPad du portrait au paysage, vous pouvez le considérer comme une vue au niveau de la racine qui change simplement son
bounds.size
de{768, 1024}
à{1024, 768}
. Sachant cela, vous devez utiliser lesize
passé dans laviewWillTransitionToSize:withTransitionCoordinator:
méthode ci-dessus pour déterminer si vous effectuez une rotation en mode portrait ou paysage.Si vous voulez un moyen encore plus transparent de migrer le code hérité vers la nouvelle façon de faire iOS 8, envisagez d'utiliser cette catégorie simple sur UIView, qui peut être utilisée pour déterminer si une vue est "portrait" ou "paysage" en fonction de son Taille.
Récapituler:
viewWillTransitionToSize:withTransitionCoordinator:
rappel dans UIViewController.statusBarOrientation
- qui est essentiellement une propriété au niveau de l'appareil - pour déterminer s'il faut mettre en page une vue pour «portrait» ou «paysage». L'orientation de la barre d'état ne doit être utilisée que par le code traitant de choses comme cellesUIWindow
qui vivent réellement au niveau racine de l'application.la source
UIViewControllerTransitionCoordinator
est un cauchemar :-(viewdidlayoutsubviews
alors? Je pensais que c'étaitviewdidlayoutsubviews
utilisé pour capturer les changements liés dus à la rotation. Pouvez-vous nous en dire plus?Basé sur la réponse très bien détaillée (et acceptée) de smileyborg, voici une adaptation utilisant swift 3:
Et dans la
UICollectionViewDelegateFlowLayout
mise en œuvre,la source
J'utilise simplement le centre de notification:
Ajouter une variable d'orientation (expliquera à la fin)
Ajouter une notification lorsque la vue apparaît
Supprimer la notification lorsque la vue disparaît
Obtient l'orientation actuelle lorsque la notification est déclenchée
Vérifie l'orientation (portrait / paysage) et gère les événements
La raison pour laquelle j'ajoute une variable d'orientation est que lors du test sur un appareil physique, la notification d'orientation est appelée à chaque mouvement mineur dans l'appareil, et pas seulement lors de sa rotation. L'ajout des instructions var et if n'appelle le code que s'il est passé à l'orientation opposée.
la source
super
deviewDidAppear
etviewWillDisappear
devrait être appeléDu point de vue de l'interface utilisateur, je pense que l'utilisation des classes de taille est l'approche recommandée par Apple pour gérer les interfaces dans différentes orientations, tailles et échelles.
Voir la section: Les traits décrivent la classe de taille et l'échelle d'une interface ici: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html
Celui-ci est également un bon article: https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/
EDIT Mise à jour du lien: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Crédit: Koen)
la source