web-dev-qa-db-fra.com

Étrange erreur UIView-Encapsulated-Layout-Height

Je fais une application de test, donc dans mon tableviewCell dans le storyboard, j'ai imageView et webView (pour show html-text). Je fixe des contraintes telles que haut/gauche/droite/hauteur = 200 pour imageView, espacement = 5 entre elles et gauche/droite/bot pour webView. Je souhaite donc calculer la hauteur de ma webView par programme, puis modifier la hauteur de la cellule pour étirer ma webView. Mais j'ai eu ceci:

Impossible de satisfaire simultanément aux contraintes.

Au moins une des contraintes de la liste suivante est probablement celle que vous ne voulez pas.

Essaye ça:

(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints & fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property

translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fd6f3773f90 V:[UIImageView:0x7fd6f3773e90(200)]>",
    "<NSLayoutConstraint:0x7fd6f3774280 UIImageView:0x7fd6f3773e90.top == UITableViewCellContentView:0x7fd6f3462710.topMargin>",
    "<NSLayoutConstraint:0x7fd6f3774320 V:[UIImageView:0x7fd6f3773e90]-(5)-[UIWebView:0x7fd6f3462800]>",
    "<NSLayoutConstraint:0x7fd6f3774370 UITableViewCellContentView:0x7fd6f3462710.bottomMargin == UIWebView:0x7fd6f3462800.bottom>",
    "<NSLayoutConstraint:0x7fd6f375ee40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fd6f3462710(205)]>"
)

Aucune suggestion?

36

Je supprime généralement cet avertissement en diminuant la priorité de la contrainte que AutoLayout tente de rompre. Donc si ça dit:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fd7c2ecb520 V:[UIView:0x7fd7c2ecd0e0(300)]>

Allez-y et réduisez la priorité de cette personne à 999

Cela devrait fonctionner. 

À votre santé.

72
Fran Sevillano

si vous utilisez tableView.rowHeight = UITableViewAutomaticDimension, vous devez toujours définir estimatedRowHeight. Par exemple:

tableView.estimatedRowHeight = 44

ou vous devriez implémenter:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

sinon, vous aurez toujours l'avertissement UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView et le contenu sera réduit de manière incorrecte

15
Paul T.

Pour moi, j'utilise une hauteur estimée pour les cellules et, pour résoudre ce problème, je règle la priorité de la contrainte de bas en bas à son voisin à 999 et tout fonctionne.

4
superarts.org

J'ai vu deux cas où cela se produit jusqu'à présent. L'une d'entre elles est documentée dans la réponse acceptée, à savoir que votre tableView: heightForRow: implémentation doit renvoyer la même valeur que vos contraintes vont calculer.

L'autre fois, cela se produit si vous oubliez de définir translatesAutoresizingMaskIntoConstraints = NO (ou false pour Swift) sur une ou plusieurs vues autolayout. Avant d'ajouter des contraintes à une vue créée par programme, désactivez le redimensionnement automatique comme suit:

view.translatesAutoresizingMaskIntoConstraints = false

Sinon, si votre vue a une largeur ou une hauteur fixe spécifiée par le masque de redimensionnement automatique, une contrainte sera créée pour l'appliquer.

2
John Stephen

Le code suivant n'a pas fonctionné pour moi

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

Ni ajouter translatesAutoresizingMaskIntoConstraints = false à un tas de vues.

Enfin, la suppression de cell.updateConstraintsIfNeeded() dans la fonction de rappel de source de données tableView:cellForRowAt rend le contenu Xcode

2
天才小飞猫

Cette erreur m'est arrivée avec un UIButton essayant de régler automatiquement sa hauteur en créant un UIView-Encapsulated-Layout-Height en conflit avec mes contraintes supérieure et inférieure.

Je l'ai corrigé en ajoutant explicitement une contrainte de hauteur.

1
Rivera

Je cours aujourd'hui dans ce problème. J'avais une vue de collection à l'écran mais ce n'était pas le problème. J'utilisais un contrôleur de vue de conteneur personnalisé et certaines vues étaient disposées avant que la vue de conteneur elle-même ne soit disposée .. L'astuce consistait à s'assurer que la vue de conteneur était d'abord affichée en appelant loadViewIfNeeded() sur le contrôleur de vue de conteneur .

Cela signifie que si 0x7fd6f375ee40 de la question d'origine correspond à la vue d'un contrôleur de vue, vous devrez peut-être vérifier si vous chargez cette hiérarchie de vues avant que certaines sous-vues ne soient affichées.

0
DevAndArtist

J'essayais d'implémenter une cellule simple avec une étiquette supérieure à une ligne et une étiquette inférieure à n ligne qui se développerait avec un texte plus long, avec l'espoir que la cellule se développerait automatiquement pour s'adapter au contenu en fonction de mes contraintes.

Il est intéressant de noter que la solution à ce problème consistait à remplacer tableView:heightForRowAtIndexPath: et tableView:estimatedHeightForRowAtIndexPath: et à renvoyer la hauteur estimée de ma ligne et UITableViewCellAutomaticDimension au lieu de définir rowHeight et estimatedRowHeight sur mon tableAfficher dans viewDidLoad:.

0
Mike