Problèmes de mise en page après la mise à jour vers Xcode 8


102

Voici un avant et un après de l'un de mes écrans après la mise à niveau vers Xcode 8.
Tout ce que j'ai fait a été d'ouvrir mon main.storyboard et à partir de là, j'ai créé et exécuté mon application sur mon téléphone.
Dans mon contrôle de version, je peux voir que Xcode apporte beaucoup de changements à mon main.storyboard juste après que je l'ouvre.
Chaque fois que je supprime ces modifications, je peux voir ce que j'utilise pour voir dans Xcode 7.3.1.
Mais, dès que je rouvre le constructeur d'interface avec mon storyboard, je vois ces changements se remettre en place.

Est-ce que je peux faire quelque chose ici?

Avant Xcode 8

entrez la description de l'image ici

Après la mise à jour vers Xcode 8

entrez la description de l'image ici


Essayez d'ouvrir à nouveau XCode 8 avec une nouvelle source (cachez toutes les modifications apportées précédemment). Maintenant, lorsque vous ouvrez le storyboard, mettez en surbrillance tous les éléments de votre interface utilisateur et cliquez sur "Mettre à jour les cadres". Cela pourrait résoudre votre problème.
d1str0

6
Pourriez-vous signaler un bogue sur bugreport.apple.com et joindre le storyboard pour lequel cela se produit? Nous aimerions analyser cela plus en détail.
Quinn Taylor le

1
J'ai exactement le même problème. Après avoir ouvert mon storyboard dans Xcode8 et accepté la boîte de dialogue "Choisir une vue initiale de l'appareil", tout se passe de façon étrange. Lorsque je mets à jour tous les cadres, l'IB a l'air bien, mais après la construction, l'application est totalement cassée. Je l'ai testé avec 4 applications.
Cherrypig le

@QuinnTaylor J'ai un problème similaire, après que Xcode 8 ait converti mon storyboard, les UIImageViews dans UITableViews ne montrent aucun contenu bien que leur contour soit visible dans Debug View Hierarchy. Les autres objets de la même classe qui se trouvent dans UICollectionViews ne sont pas affectés.
Manuel du

XIB ou Storyboard a défini par défaut la version 7.x plus ancienne et Enregistrer et fermer. Solution temporaire, mais fonctionne. Ne pas ouvrir à nouveau une fois que vous avez terminé Enregistrer et fermer. Sinon, à nouveau, vous devez suivre les mêmes étapes depuis le début.
Bhavesh Kumbhani

Réponses:


111

J'ai eu un problème similaire avec les images de tableview n'apparaissant pas une fois que j'ai converti le fichier de storyboard pour qu'il soit compatible Xcode8. Cela ressemble à un bogue avec Xcode8, donc jusqu'à ce qu'un correctif de bogue soit publié, voici une solution:

  1. Ouvrez votre storyboard dans Xcode 8 et choisissez une vue initiale de l'appareil. Apportez des modifications comme vous le feriez normalement.
  2. Une fois que vous avez terminé vos modifications, sélectionnez le storyboard -> Inspecteur de fichiers -> Ouvre dans -> Sélectionnez 'Xcode 7.x'.

entrez la description de l'image ici

  1. Sélectionnez «Enregistrer et fermer» lorsque vous y êtes invité
  2. Les modifications de votre storyboard seront enregistrées et votre storyboard fonctionnera comme avant Xcode8.

Lorsque vous devez apporter d'autres modifications au fichier de storyboard, suivez à nouveau ces étapes.


Wow +1 pour cela à coup sûr. J'ai eu du mal avec cela dans iOS 10 dans mon TodayExtension. Ce n'est que lorsque j'ai réduit les choses, en analysant les différences git, que j'ai vu des modifications suspectes du storyboard xml ajoutées par Xcode 8. Après avoir enregistré le document de storyboard pour Xcode 7 (après avoir effectué mes modifications), je peux maintenant construire et expédier en utilisant Xcode 8 pour iOS 10. Merci.
John Erck

Cela ressemble vraiment à un bug. L'enregistrement en tant qu'ouverture dans Xcode 7.x a fonctionné pour moi comme une solution de contournement temporaire.
Steve A

J'ai passé les 3 derniers jours à réparer toute la mise en page cassée d'un endroit à l'autre dans Xcode8 jusqu'à ce que je trouve ce message. Je devrais probablement faire plus confiance aux gens comme vous qu'à Apple. Je ne peux pas croire que cela a gaspillé autant de temps. Merci beaucoup David pour cela!
Xu Yin

@XuYin Devrions-nous faire cela pour chaque storyboard? Je veux dire que faire si j'ai un autre storyboard dans mon projet? Qu'en est-il des fichiers Xib? dois-je le faire pour ceux-là aussi?
Honey

@Honey je ne l'ai pas fait sur le storyboard, mais je l'ai fait sur chaque fichier xib avec lequel j'ai un problème. mais je pense que vous voudrez peut-être l'essayer également sur le storyboard si vous voyez un problème de mise en page étrange. puisque ce correctif ne prendra que 5 secondes environ. et après avoir reconstruit l'application, vous devriez pouvoir voir le correctif très rapidement.
Xu Yin

14

XIB ou Storyboard a défini par défaut la version 7.x plus ancienne et Enregistrer et fermer. Solution temporaire, mais fonctionne. Ne pas ouvrir à nouveau une fois que vous avez terminé Enregistrer et fermer. Sinon, à nouveau, vous devez suivre les mêmes étapes depuis le début.entrez la description de l'image ici


6
Cela n'aide pas car j'ai besoin de travailler sur le fichier. Tout cela ne fait que sauvegarder le fichier pour une compatibilité descendante. Il ne permet pas de modifier le xib dans Xcode 8.
jowie

Je fais cela, mais encore une fois, lorsque je sélectionne le fichier xib dans la liste déroulante, il affiche uniquement xcode 8.0 ...
jayant rawat

8

Eh le même problème. J'ai partiellement réussi à le réparer de la manière suivante ( pour Xcode Version 8.1 (8B62) )

Dans le contour du document de Storyboard, j'ai cliqué sur chaque scène qui avait la flèche jaune indiquant certains problèmes de mise en page (numéro 1 sur la capture d'écran)

Après cela, pour chaque scène problématique, je devais cliquer sur la petite icône "Update Frames" (numéro 2 sur la capture d'écran) qui corrigeait tous les problèmes de mise en page par scène.

entrez la description de l'image ici

Cependant, une scène dans mon cas était toujours en état de pleurer après la transition de Xcode7 à Xcode8. J'ai dû le corriger manuellement en ajustant les contraintes ou en ajoutant des contraintes manquantes.

Ouf, pas belle surprise de XCode8 et Storyboards. Si vous avez utilisé l'éditeur AppCode, vous n'aurez pas ce problème, car il ne prend pas en charge les Storyboards; P

Bonne chance!



6

Veuillez suivre les fils pour toute solution possible: (je crois que cela arrive à de nombreux développeurs).
Xcode 8 GM seed Storyboard issue
Xcode 8 - Les storyboards précédents se déformaient

(j'ai utilisé anyH anyW largeur 600) Lorsque Xcode a été mis à jour vers Xcode 8, il a changé la taille de tous mes ViewControllers. En conséquence, toute la mise en page a été déformée.
Actuellement, je ne vois que 3 solutions pour le problème (je ne serais pas sûr d'attendre bientôt un correctif).

1. allez pour chaque Viewcontroller et corrigez-le par Update Frames.

Allez dans le ViewController principal Size Inspector -> Freeform -> 600car la plupart des contrôleurs sont déduits que cela changera la taille de chacun d'entre eux (soyez prudent sur l'impact des nouvelles fonctionnalités que Apple souhaite présenter).

3. Ignorez les modifications de git pour le storyboard (je ne le suggérerais pas car Apple a également inséré des mises à jour qui peuvent être importantes pour Xcode).

Lien supplémentaire pour les nouvelles fonctionnalités d'AutoLayout dans Xcode 8 (WWDC16): Making Apps Adaptive, Part 1


1
L'option 1 est la plus sensée et cela a fonctionné pour moi. Comme le note Mike.R, veillez à ne pas essayer de «tromper» XCode pour qu'il répare les choses, car plus de problèmes sur la piste sont inévitable.
arcady bob le

J'ai également utilisé l'option 1 (je pense que c'est plus sûr). Mais cela prend du temps.
Mike.R du

5

Dans mon cas, fonctionne les solutions suggérées par Akhil Kateja et je dois également réinitialiser la largeur et la hauteur de la vue principale:

1) Définissez la taille de la vue sur la forme libre

entrez la description de l'image ici

2) Réinitialisez la largeur et la hauteur de la vue à la taille d'origine:

entrez la description de l'image ici

Enfin, enregistrez et vous avez terminé.


4

Pour moi, la solution était simplement de cliquer sur le UIViewController ayant des problèmes, puis Editor > Resolve Auto Layout Issues > All Views In ... > Updates Frames

Il a réorganisé les vues pour s'adapter aux contraintes existantes en fonction de la nouvelle vue par défaut sélectionnée (iPhone 7 dans mon cas).

A noter également: si vous obtenez un avertissement de vue déplacée de la barre de navigation comme je l'ai fait, sélectionnez simplement UINavigationController / UIViewController, puis Attributes Inspector > Bar Visibility > Shows Navigation Bardésactivez-le, puis réactivez-le .


3

Définir la taille de la vue sur Freeform à partir de Inferred a fonctionné pour moi. Il se trouve sous l'en-tête Mesures simulées dans l' inspecteur d'attributs .


3

J'ai eu le même problème et je l'ai résolu en mettant à jour de force les contraintes de vue du contrôleur. Placez le code suivant dans votre viewDidLoad () fonction

self.view.layoutIfNeeded()

1
Cheers Bill! que «layoutIfNeeded» a fonctionné pour moi! (Après avoir tout essayé pendant des heures ..)
Ethan Halprin

3

J'ai sélectionné chaque contrôleur et cliqué sur "Mettre à jour les cadres" et cela a corrigé la mise en page.


3

La réponse de @ david-truong ( https://stackoverflow.com/a/39589860/1407528 ) ne fonctionne pas dans mon cas, donc si vous êtes dans la même situation, essayez ceci:

Si tous vos appareils sont mis à jour vers iOS 10+, cette version de Xcode ne reconnaîtra pas ces appareils comme des appareils compatibles. Alors, essayez avec cette astuce:

  • Accédez à: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • Copiez les dossiers liés à iOS 10 ou 10.1 dans: / Applications / Xcode 7.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • Ouvrez le projet avec Xcode 7.3.1 (redémarrez Xcode si vous l'avez déjà ouvert)
  • Sélectionnez votre appareil iOS 10+ connecté
  • Push Run

Remarque: les nouvelles fonctionnalités telles que Swift ne seront pas disponibles en utilisant cette astuce, mais vous devriez pouvoir charger et créer votre projet.


3

J'espère que cela aidera

Lorsque j'ai mis à jour Xcode de la version 7.3 à Xcode 8 et que j'ai exécuté l'application, certaines des vues sont parfaitement affichées mais certaines sont déformées.Ensuite, j'ai vérifié le fichier de la pointe et cela m'a invité à choisir la taille de l'appareil particulière, puis à afficher la pointe en fonction de cela la taille de l'appareil, ce qui n'est pas le cas Any-Any(Xcode 7.3). Ainsi, tous les fichiers nibs ne s'affichent pas correctement.

Solution de travail de moi: - appuyez sur la flèche jaune comme indiqué dans l'image ci-dessous

entrez la description de l'image ici

il affichera une fenêtre contextuelle affichant des options telles que

entrez la description de l'image ici

choisissez Update Framesavec Apply to all views in containerchecked.it résoudra environ 90% de l'interface utilisateur déformée et le reste du problème des contraintes de mise en page automatique pourra être résolu manuellement.


Cela pourrait également gâcher les mises en page. À mon humble avis, cela doit être fait avec beaucoup de soin, une vue à la fois et en vérifiant si les choses ont fonctionné avant de continuer.
brainray

oui, bien sûr, vous devez prendre du temps pour cela et cette solution pourrait vous aider à plus long terme, comme lorsque vous souhaitez mettre à jour une partie de votre interface utilisateur.
Anurag Bhakuni

1

J'ai résolu le problème en utilisant la version 7.3.1 de Xcode, vous pouvez télécharger le fichier .dmg à partir du portail des développeurs Apple. J'ai utilisé l'Autoresizing dans chaque application et cela fonctionne très bien pour moi. Je mettrai à jour vers Xcode 8 uniquement s'ils peuvent résoudre ce bogue.

Téléchargez-le ici: https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg


Cette solution est inutile si vous souhaitez prendre en charge iOS 10
jungledev

1

Pour résoudre un problème similaire, j'ai configuré le xib comme Freeform (non déduit) ET enregistré le fichier xib comme compatible Xcode 7.x. Les deux étapes étaient nécessaires dans mon cas. J'espère que cela aide!


1

Je remarque un nouveau bouton dans Xcode 8.2, (vérifiez le cercle orange dans l'image). Cela vous aidera.

Étapes: 1. Ouvrez le storyboard et sélectionnez le périphérique de votre choix 2. Sélectionnez simplement le contrôleur de vue 3. Cliquez sur le bouton mentionné (comme dans l'image) 4. Il mettra à jour le cadre de ce contrôleur de vue et vous pourrez continuer avec

Je n'ai pas trouvé de meilleure solution que celle-ci. Veuillez répondre si vous en trouvez un.

Capture d'écran IB


Rien n'est arrivé.
Muju

0

la mise à jour des contraintes et des sous-vues de mise en page dans viewdidload résout le problème

- (void) viewDidLoad {
        [self.view updateConstraints];
        [self.view layoutSubviews];
        [super viewDidLoad];
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.