Comment est-il possible que la hauteur UITableViewCellContentView soit différente de heightForRowAtIndexPath:
Je me pose vraiment un problème bizarre sur mon UITableView.
J'ai quelques cellules différentes que je veux afficher sur un fil d'actualité-comme la vue de la table.
Et j'ai un problème avec un cellulaire après la réutilisation.
La cellule contient deux images, deux étiquettes et une vue avec un partage/like/commentaire boutons.
Je vais essayer de le dessiner, mais je ne suis pas sûr que ça va être joli :
-------------------------------------------------
| | __ ____________________________ |
| | |_2| | | |
| | | 3 | |
| | | | |
| 1 | |____________________________| |
| | |
| |_______________________________________|
| | |
| | 4 |
|_______|_______________________________________|
| |
| 5 |
|_______________________________________________|
1 : objectImage
2 : subjectImage
3 : titleLabel
4 : commentLabel
5 : actionsView
Et mes contraintes sont :
"H:|-0-[objectImage(60)]-7-[subjectImage(30)]-7-[titleLabel]-7-|"
"H:|-0-[objectImage(60)]-0-[commentLabel]-0-|"
"H:|-0-[actionsView]-0-|"
"V:|-0-[objectImage(>=35)]-0-[actionsView(44)]-0-|"
"V:|-7-[subjectImage(30)]"
"V:|-7-[titleLabel(>=46)]-7-[commentLabel(>=35)]-0-[actionsView(44)]-0-|"
Et à chaque fois que la cellule est tiré, je change de cette contrainte:
"V:[commentLabel(%0.2f)]"
Les cellules affichent parfaitement la première fois.
Mais, le problème que j'ai, c'est qu'à un moment, après quelques réutilisation (je ne peux pas le reproduire à chaque fois) l'application se bloque en raison d'une contrainte de problème.
Ici est l'exception:
"<NSLayoutConstraint:0x205a75b0 V:[UILabel:0x1ef31430(105)]>",
"<NSLayoutConstraint:0x1ef34440 V:[UILabel:0x1ef31430]-(0)-[UIView:0x1ef2fe50]>",
"<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>",
"<NSLayoutConstraint:0x1ef33900 V:|-(7)-[UILabel:0x1ef31250] (Names: '|':UITableViewCellContentView:0x1ef2bf50 )>",
"<NSLayoutConstraint:0x1ef34340 V:[UILabel:0x1ef31250(>=46)]>",
"<NSLayoutConstraint:0x1ef33210 V:[UIView:0x1ef2fe50]-(0)-| (Names: '|':UITableViewCellContentView:0x1ef2bf50 )>",
"<NSLayoutConstraint:0x1ef331d0 V:[UIView:0x1ef2fe50(44)]>",
"<NSAutoresizingMaskLayoutConstraint:0x1ef36f90 h=--& v=--& V:[UITableViewCellContentView:0x1ef2bf50(147)]>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>
Le problème est que la contrainte [UITableViewCellContentView:0x1ef2bf50(147)] n'est pas droit.
Ce qui est bizarre, c'est que le heightForRowAtIndexPath: renvoie la valeur correcte qui est de 217.
Et ce que je ne comprends pas, c'est que la hauteur de la UITableViewCell est correct!
(lldb) po 0x1ef2bf50
$0 = 519225168 <UITableViewCellContentView: 0x1ef2bf50; frame = (0 0; 320 147); gestureRecognizers = <NSArray: 0x1ef30a20>; layer = <CALayer: 0x1ef2a3d0>>
(lldb) po [0x1ef2bf50 superview]
$1 = 0x1ef30e40 <NewsSubjectCommentCell: 0x1ef30e40; baseClass = UITableViewCell; frame = (0 1055; 320 217); hidden = YES; autoresize = W; layer = <CALayer: 0x1ef25e10>>
Donc je ne comprends pas comment est-il possible que la hauteur de la contrainte de UITableViewCellContentView est 147. Il est à la hauteur d'une autre cellule du même type, mais il devrait être changé à 209, droit?
Donc, si vous en avez un aperçu sur la façon dont cela peut arriver (peut-être que j'ai fait quelque chose de mal), je serais heureux.
Merci,
source d'informationauteur Talal MAZROUI
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la réponse ici : Mise en page automatique problème de contraintes sur iOS7 dans UITableViewCell
Nous avons juste à définir la AutoresizingMask de la contentView à UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth et ... problème résolu!
Vous pourriez essayer de mettre la (/des) hauteur d'au moins prioritaires (par exemple, @900). J'ai eu un problème similaire (mon UITableViewCellContentView était trop petite et les contraintes ne peut pas être satisfait). Après j'ai baissé la priorité de mon "mal" de hauteur, il était couché très bien à l'intention des hauteurs.
Vous devez éteindre d'un redimensionnement automatique de conversion de la vue qui contient vos contraintes si vous ajoutez vos contraintes avec le code ou langage visuel:
Cela empêche la
[UITableViewCellContentView:0x1ef2bf50(147)]
contrainte d'être créé.Dans cellForRowAtIndexPath vous demande une cellule de la tableview. La cellule que vous obtenez soit une cellule nouvellement créé (avec la taille 320,44) ou une cellule qui a été retiré et envoyé le prepareForReuse message (à n'importe quelle taille elle avait précédemment). Lorsque vous appliquez le code NSLayoutConstraints à la contentView ils sont résolus avant la cellule s'adapte lui-même à la tableview espace prévu. Cela n'a aucun sens, mais est certainement la conclusion de mes observations.
Donc, dans mon exemple j'ai été faire de nouvelles cellules avec 44 la hauteur, mais l'un de mes contraintes pour une hauteur fixe de 48. C'était de lever des exceptions en permanence et de faire du débogage d'une douleur. Tout ce que je fait pour rendre les exceptions en aller était de définir le cadre de la cellule à la bonne hauteur (et largeur, je suppose que si vous rencontrez des problèmes sur la dimension horizontale) quand je la prépare dans cellForRowAtIndexPath.
La cellule redimensionne automatiquement à la bonne dimension avant qu'il s'affiche dans la tableview, afin de ne pas causer de problèmes, mais vos contraintes de mise en forme sera appliquée sans avoir besoin d'être cassé " par iOS...