web-dev-qa-db-fra.com

Qu'est-ce qu'une contrainte 'UIView-Encapsulated-Layout-Width'?

Je continue à avoir des exceptions 'Impossible de satisfaire simultanément les contraintes' (Xcode 5, iOS 7, à la fois sur le périphérique et sur le simulateur), où l'une des contraintes de la liste ressemble à ceci:

"<NSLayoutConstraint:0x165b23d0 'UIView-Encapsulated-Layout-Width'
H:[StoryPlayerCell:0x165affc0(0)]>"

Je n'ai pas défini cette contrainte moi-même. Ce n’est pas non plus une NSAutoresizingMaskLayoutConstraint. Mais d’où vient-elle? Et comment puis-je m'en débarrasser?

Je n'ai aucune idée… .. Et je ne trouve rien sur 'UIView-Encapsulated-Layout-Width' dans la documentation d'Apple… .. Même la recherche sur Google ne renvoie rien du tout.

Aucune suggestion?

PS: J'utilise cette cellule dans une UICollectionView avec une sous-classe personnalisée de UICollectionViewFlowLayout. Peut-être que la partie 'Encapsulated-Layout' a quelque chose à voir avec cela?

46
Goodsquirrel

Un correctif rapide et pratique consiste à affecter une valeur de priorité 999 aux contraintes personnalisées avec une priorité élevée. Les contraintes encapsulées et générées automatiquement doivent dominer avec une priorité plus élevée que vos contraintes.

https://stackoverflow.com/a/25795758/590010

16
DZenBot

j'ai joué avec l'exemple, je pense que ces codes sont à l'origine de l'exception Autolayout. 

CGFloat height = MAX(0, -y + maxY); ligne 79 dans CSStickyHeaderFlowLayout.m. 

si vous utilisez une valeur statique pour la hauteur telle que 200, l'exception ne se reproduira plus. Je ne comprends pas ce qu'est exactement UIView-Encapsulated-Layout, mais il me semble que changer dynamiquement le cadre UICollectionViewLayoutAttributes peut être à l'origine de ce problème. dans l'exemple de projet, c'est la hauteur, dans le problème de PO, je suppose que c'est la largeur. Peut-être que je peux creuser un peu plus, si vous pensez que cela serait utile

3
Xu Yin

J'ai trouvé cela avec iOS 10 builds où j'utilisais des sous-classes UITableViewCell sous forme de vues normales et non sous forme de lignes de tableau. La cellule contraignait son contentView à une largeur nulle.

La solution de contournement que j'ai utilisée consistait simplement à ajouter contentView à la hiérarchie de la vue au lieu de la cellule tableview. Je me suis également assuré de conserver la cellule tableView (car elle n'était plus conservée par la hiérarchie des vues elle-même).

1
Joseph Lord

Je peux faire la lumière sur la réponse à la question. Dans mon application OS X, j'ai trouvé une contrainte aussi mystérieuse sur la vue de la cellule d'un NSTableView (c'est-à-dire un objet que j'avais précédemment renvoyé dans la méthode NSTableViewDelegate -tableView: viewForTableColumn: row). J'avais également envoyé un message setWidth: 0.0 à cette même colonne de table. La modification du paramètre dans la valeur définie de setWidth: de 0,0 à autre était reflétée dans la valeur constante de la contrainte mystérieuse.

Conclusion: les contraintes qui se connectent elles-mêmes avec 'UIView-Encapsulated-Layout-Width' ou 'NSView-Encapsulated-Layout-Width' sont provoquées par la définition de la largeur d'une colonne de tableau, ou quelque chose de similaire.

0
Jerry Krinock

Ma situation

Pour moi, je savais (logiquement) que mes contraintes programmatiques auraient dû fonctionner. Je les mettais à jour après la rotation de l'appareil.

Ma solution simple et rapide sans changer les contraintes était de m'assurer que tout cela était fait sur le thread principal. Pourquoi? Je ne suis pas trop sûr, mais je suppose que la mise à jour de la rotation doit être dans un thread asynchrone.

Comment je l'ai réparé

De:

topTitleLeadingAnchorLandscape.isActive = true

À:

DispatchQueue.main.async {
    self.topTitleLeadingAnchorLandscape.isActive = true
}

J'espère que cela fera gagner beaucoup de temps à quelqu'un! ????

0
George_E