Pourquoi la présentation modale d'un controller de vues interrompt la layout automatique dans ma vue de table?

Exemple de projet: http://cl.ly/1o2K2m2r262q

J'ai un UITableView avec des cellules personnalisées dont la hauteur est calculée automatiquement à partir de la disposition automatique. Les cellules personnalisées comportent trois labels, chacune étant positionnée avec un espacement vertical entre elles et la vue du contenu, et repoussée du côté gauche.

Cela fonctionne très bien lorsque je saisis datatables et qu'elles se chargent.

Toutefois, lorsque je présente de manière modale un controller de vue depuis le controller de vue hébergeant la vue de table, je remarque qu'il interrompt complètement la layout automatique lorsque je reviens au controller de vue d'origine.

Qu'est-ce qui causerait ça? Je peuple datatables dans un tableau simple qui agit comme le model pour la source de données de la vue de table, alors c'est juste la disposition automatique. C'est un projet si simple que je suis confus là où il serait batifoler.

Ajout: J'apprécie la réponse de rdelmar, mais je ne peux tout simplement pas croire qu'il n'y a pas une seule application livrée en ce moment qui profite de cette fonction de cellule dynamic d'iOS 8 sans faire des vues de table terriblement sautillantes. Ce serait incroyablement perceptible. Quelqu'un doit avoir trouvé un moyen de faire ce travail, sinon ils ne l'auraient jamais expédié.

Vous avez plusieurs problèmes. Dans le storyboard, une flèche d'avertissement rouge apparaît dans la list des scènes. Tu ne devrais pas ignorer ça. Cliquez dessus et effectuez les changements suggérés (faites d'abord les valeurs de résistance à la compression, et je pense que le contenu qui s'enveloppe disparaît tout seul).

Dans viewDidLoad de MasterViewController, ajoutez ces deux lignes dont vous avez besoin pour les cellules auto-dimensionnables,

 self.tableView.estimatedRowHeight = 120 self.tableView.rowHeight = UITableViewAutomaticDimension // you may not need this one, I think it might be the default now 

Enfin, j'ai trouvé que lorsque je fais la cellule dans le storyboard (par opposition au code), j'ai besoin d'append la méthode suivante à la class de cellule, donc la layout se passe tout de suite (sinon, elle ne vous faites défiler ou faites pivoter),

 override func didMoveToSuperview() { self.layoutIfNeeded() } 

Le problème est dans la résistance à la compression de votre label: Vous avez décrit, quelle label résiste le plus au changement de hauteur: Essayez de définir différentes valeurs pour la priorité d'étreinte du contenu -> Verticale et priorité de compression de contenu -> Verticale pour les labels:

  • "Petite list d'animaux"
  • "Liste des animaux"
  • "Encore plus petite list"

Vous utilisez également le calcul automatique de la hauteur de la cellule UITableView, mais vous devez configurer la table pour cela:

 override func awakeFromNib() { super.awakeFromNib() tableView.estimatedRowHeight = 200; // You need approximately calculate this value by yourself, used mostly for the scroll indicator displaying tableView.rowHeight = UITableViewAutomaticDimension; } 

Ou vérifiez votre projet mis à jour https://dl.dropboxusercontent.com/u/48223929/LayoutingTest.zip

La solution est beaucoup plus facile que vous ne le pensez. Vous avez demandé au storyboard de build une tableview avec une hauteur de ligne de 44. Sélectionnez votre tableView dans Storyboard et vérifiez ceci:

Ancienne tableViewView height

Vous devez configurer une tableViewView hauteur de la ligne initiale à quelque chose de plus grand que ce que vous pouvez penser que votre cellule va se développer, 200 par exemple ou même plus:

Table suggéréeVoir la hauteur des lignes

Ensuite, lorsque iOS tente de build une nouvelle cellule avec la hauteur 200, il remplit l'label, calcule les tailles, puis il réduit les cellules.

Pourquoi cela arrive-t-il?

Je pense – pas sûr – que l'idée est la façon dont iOS construit tablesViews. iOS affiche toujours 8-10 cellules sur l'iPhone, si la cellule est initialement plus grande que sa hauteur réelle calculée, alors iOS réduit la cellule et crée / supprime une nouvelle cellule à afficher -si nécessaire-. Si la cellule doit être plus grande, iOS devra peut-être masquer une ligne qui devait initialement être affichée , puis elle refusera d'agrandir votre cellule. C'est pourquoi vous devriez toujours préférer build des cellules plus grandes que les plus petites en hauteur.

Le problème ne se produit pas en raison de la vue modale.

Cela est dû à la hauteur de ligne que vous avez spécifiée pour la vue de la table. Actuellement, il est 44, changer à 200 ou plus et tout ira bien.

Storyboard

Vérifiez également les avertissements dans le file Storyboard.