web-dev-qa-db-fra.com

La contrainte de redimensionnement automatique de UITableView se brise mystérieusement sur l'iPhone 6Plus

J'ai un UITableViewCell personnalisé qui a une vignette et un tas de texte. La hauteur de la ligne est configurée pour être calculée automatiquement à l'aide de 

tableView.estimatedRowHeight = 129;
tableView.rowHeight = UITableViewAutomaticDimension

La hauteur de la ligne doit être calculée exactement comme 138 points. Tout semble parfait sur l'iPhone 5. Toutefois, sur l'iPhone 6 Plus, la hauteur automatique des lignes échoue de façon INTERMITTENTE pour des lignes aléatoires avec le journal suivant.

(
    "<NSLayoutConstraint:0x17009ddd0 V:|-(20)-[scoop.ThumbnailImage:0x124d2a5a0]   (Names: '|':UITableViewCellContentView:0x124e23200 )>",
    "<NSLayoutConstraint:0x17009de70 UITableViewCellContentView:0x124e23200.bottomMargin == scoop.ThumbnailImage:0x124d2a5a0.bottom + 20>",
    "<NSLayoutConstraint:0x17009e780 V:[scoop.ThumbnailImage:0x124d2a5a0(90)]>",
    "<NSLayoutConstraint:0x17009ef00 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x124e23200(138.333)]>"
)

La dernière ligne du journal semble indiquer que, pour une raison quelconque, la hauteur de la ligne a été calculée comme suit: 138.333 au lieu de 138 . Cela fait un moment que je me frappe à la tête, mais je suis incapable de comprendre pourquoi cela se produit. Puis-je avoir une aide s'il vous plait?

Update: Voici à quoi ressemble la cellule de la vue tableau.

cell

UPDATEJe ne pouvais pas extraire le code du référentiel principal car il faisait partie d'un projet plus important. Mais j’ai réussi à reproduire le problème avec un projet très simple et sain d’esprit. Veuillez le trouver ici sur github .

22
suparngp

Cet avertissement vous indique que vos contraintes sont en conflit. Réduisez la priorité de la contrainte de hauteur à 999 et elle disparaîtra. Testé dans votre projet Github et a parfaitement fonctionné.

 enter image description here

28
Yariv

0.333 sur un affichage à l’échelle 3x (l’iPhone 6+) est probablement connecté au séparateur de cellules.

Notez que vos contraintes ne définissent pas la taille de la cellule, mais la taille de la variable contentView. Mais la cellule doit ajouter 2 pixels (= 0,666 points) à la hauteur de cellule pour le séparateur de cellules. Autolayout tente de conserver les positions d'affichage sur les limites des nombres entiers. L'ajout de 0,666 point à la hauteur de la cellule peut entraîner l'ajout de 0,333 à la hauteur de votre contenu.

Vous pouvez éviter cette erreur en définissant vos séparateurs de table sur None. Bien que définir l’une des priorités sur 999 (généralement la priorité la plus basse) comme l’autre réponse ait suggéré, c’est une bonne solution en général.

2
Sulthan

L'avertissement vous dit exactement quel est le problème, mais vous ne le réaliserez peut-être pas. Les trois premières contraintes concernent une image de 90 pixels de hauteur située à 20 pixels sous le sommet de son conteneur et à 20 pixels au-dessus de son conteneur margin . C'est 130, et ce n'est pas compatible avec la quatrième contrainte, qui veut une hauteur totale de 138. Cependant, parce que la contrainte de bord inférieure est relative à la marge du conteneur, cela ajoute un certain nombre de pixels. Supprimez la contrainte de hauteur totale (ma recommandation) ou modifiez les montants des bords supérieur et inférieur. 

0
NRitH