1

J'utilise UISplitViewController. Je voulais afficher une scène de détail de sélection vide lorsque l'utilisateur fait pivoter son iPhone 6 Plus en mode portrait et ne voit plus aucun détail. (Tous les autres appareils se comportent de manière prévisible, seul le 6 Plus peut changer son apparence.) J'utilise maintenant un split view delegate qui implique des requêtes bizarres, mais ce n'est pas le but.Réagir à la rotation iPhone 6+ - traitCollectionDidChange: appelé deux fois pour le contrôleur de navigation

Je me demandais comment savoir si l'iPhone 6 tournait en paysage.

La meilleure idée que j'ai trouvée: réagir aux changements de l'environnement des traits. Le contrôleur de vue maître reste compact à tout moment, seul son contrôleur de vue de navigation parent passe du compact au régulier et inversement. Lorsque vous utilisez un contrôleur de vue partagée, pour les sous-classes UINavigationController dans le "Maître", traitCollectionDidChange: sera appelé deux fois en utilisant un iPhone 6 Plus et en tournant en mode paysage. Il est appelé une fois en tournant en arrière.

willTransitionToTraitCollection:withTransitionCoordinator: est même appelé trois fois et 1 fois, respectivement.

J'imagine que c'est parce que dans le paysage, vous pouvez voir deux contrôleurs de vue côte à côte. Cela n'a pas de sens pour moi que le UINavigationController reçoive les appels pour les contrôleurs sous vue, cependant.

Étant donné que UITraitCollections ne contient pas d'informations sur le contrôleur de vue affecté, je ne peux pas déterminer si l'environnement est passé de la taille horizontale régulière à la taille horizontale compacte de façon fiable. Une des collections de traits rapportera la nouvelle valeur correcte, mais je ne peux pas les discerner les uns des autres. Comment avez-vous résolu cela, maintenant que les rappels sont appelés plusieurs fois avec des valeurs différentes?

+0

Avez-vous déjà trouvé cela? – Luke

+0

Malheureusement, non. Je peux proposer une théorie ad hoc à ce sujet, mais c'est seulement sur l'iPhone 6, pas sur l'iPad. Peut-être que c'est un bug? Quand je toucherai la base de code plus tard cette année, je jetterai un coup d'œil avec le SDK alors le plus récent ¯ \\ _ (ツ) _/¯ – ctietze

Répondre

3

Je sais que c'est un vieux fil mais je ne pouvais pas trouver la solution pour le même problème en ligne alors voici mes deux cents.

Le UISplitViewController est un contrôleur de conteneur. Donc il est considéré comme "affiché" même s'il y a des contrôleurs de vue dessus. Dans la documentation sur la pomme, il est indiqué:

"Les contrôleurs de présentation transmettent le message de changement de trait à leurs contrôleurs de vue enfants Les contrôleurs de présentation transmettent le changement de trait à leur contrôleur de vue présenté." Par conséquent, chaque fois que vous introduisez un changement dans la classe de taille du contrôleur de vue éclatée, il appelle son délégué et les délégués de ses deux enfants.

Pour plus d'informations chèque: https://developer.apple.com/reference/uikit/uicontentcontainer/1621511-willtransitiontotraitcollection

Edit: Je viens de remarquer que je ne l'ai pas expliquer pleinement pourquoi le UISplitViewController est appelé trois fois. Si le willTransitionToTraitCollection: withTransitionCoordinator: n'est pas implémenté dans les vues présentées, il suit probablement la convention qu'Apple définit pour cela:

"Si vous surchargez cette méthode dans vos propres objets, appelez toujours super à un certain moment dans votre implémentation pour que UIKit peut transmettre les modifications de caractéristiques au contrôleur de présentation associé et à tous les contrôleurs de vue enfants. " Je pense que l'idée sous-jacente est que lors d'un changement dans le traitCollection d'un contrôleur de vue enfant, vous voudrez peut-être changer la disposition et/ou le nombre de ses frères et soeurs.À cette fin, tout changement dans les contrôleurs enfants doit appeler le conteneur pour qu'il sache ce qui se passe et ajuster en conséquence. Cependant, il ne peut pas suivre le changement qui chevauche les autres afin que tous soient enregistrés. Ma solution était de gérer le changement dans les contrôleurs de vue enfant (UINavigationControllers dans mon cas) au lieu du splitViewController en les sous-classant et en ajoutant la logique de transition.

+0

C'est la meilleure théorie dont j'ai entendu parler, encore :) Donc, je l'accepterai jusqu'à quelque chose mieux vient. (Vive la méthode scientifique!) – ctietze