web-dev-qa-db-fra.com

contraintes de blocage automatique iOS 8/XCode 6 appliquées après l'affichage de la vue

J'ai un projet qui fonctionnait parfaitement avec XCode 5 et iOS 7, mais lorsque j'ai récemment téléchargé XCode 6, j'ai remarqué un comportement étrange avec autolayout.

J'ai un storyboard avec une vue qui a juste un UIImageView et deux UILabels. Cette vue est chargée à l'aide d'un UiPageViewController. UIImageView est centré horizontalement et verticalement dans la vue et des contraintes spécifient la distance entre les deux étiquettes et la vue image. En cas de conflit entre les valeurs du storyboard et de l'autolayout (par exemple, dans le storyboard, une étiquette se trouve à 20 pixels au-dessus de la vue de l'image, mais l'autolayout indique qu'il devrait être de 40 pixels au-dessus), la valeur de l'autolayout était appliqué avec succès avant le chargement de la vue. Ainsi, lorsque la vue est affichée pour la première fois, tout est au bon endroit.

Maintenant, avec iOS 8/XCode 6, je vois que la vue se charge, puis les choses retournent à leur position finale de mort automatique. Ce saut est perceptible par l’utilisateur final, à la fois dans le simulateur et sur un appareil réel, et c’est vraiment ennuyant. Est-il possible de revenir à l'ancien comportement? Autant que je sache, aucun code n'a été modifié pour causer ce problème.

25
wuc

Où est votre code qui modifie vos contraintes?

Si vous le gardez dans viewWillAppear: vous aurez ce problème. J'ai trouvé que viewDidLayoutSubviews fonctionne bien pour iOS8 mais pas toujours pour iOS7 à l'envers.

Finalement, si vous ne pouvez pas utiliser viewDidLayoutSubviews , je suggérerais de masquer la vue du conteneur dans viewDidLoad et de la masquer dans viewWillAppear , uniquement après que les contraintes ont été appliquées. Cela vous prend un petit délai supplémentaire lors du chargement de l'écran mais le changement de contrainte devient transparent pour l'utilisateur.

9
Marcelo Ribeiro

Pour moi, c'était un problème avec la barre d'onglets de mon projet. Je n'en avais pas besoin dans cette vue et je l'ai caché dans Push. Ainsi, lorsque la vue était poussée sur la pile, la barre était masquée et les contraintes ajustées en conséquence. Donc, je viens de mettre la barre d'onglets po.

0
dcotter

J'ai eu un problème similaire et j'ai placé les éléments dans une vue de conteneur en prévision de leur dissimulation, puis en les affichant comme suggéré dans l'autre réponse.

Je n’aimais pas cela comme solution et j’ai fini par ne pas avoir à le faire.

Le simple fait de les placer dans une vue de conteneur qui était liée à celle du contrôleur a permis d'éviter que le problème ne se produise.

0
mwright