web-dev-qa-db-fra.com

Impossible de satisfaire simultanément aux contraintes - Aucune contrainte en place

J'ai traversé et enlevé chaque contrainte utilisateur mais je reçois toujours l'erreur suivanteONLYaprès avoir fait pivoter le périphérique. Je n'ai absolument aucune idée pourquoi. Quelqu'un a-t-il une idée?

2013-01-14 21:30:31.363 myApp[35869:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (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 and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>",
    "<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>",
    "<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260]   (Names: '|':UIView:0xa330270 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
54
The Crazy Chimp

Regardons ces un par un.

"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"

Cela signifie que la vue 0xa330270 (A) doit avoir une hauteur de 768 points.

"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )>"

Cela signifie que le bord inférieur de la vue 0xa331260 (B) doit être égal à -1 du fond de A, qui est supérieur.

"<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270 )>"

Cela signifie que le bord supérieur de B doit être de 841 points par rapport au sommet de sa vue d'ensemble, A.

Ces trois choses ne peuvent pas toutes être vraies - A ne peut pas être haute de 768 points, et contient une sous-vue avec un bord supérieur 841 points insérés du haut et -1 points insérés du bas . Où avez-vous défini chacune de ces contraintes?

Vous n'avez pas indiqué quelle disposition vous souhaitez utiliser, mais il semblerait que vous ayez un masque de redimensionnement automatique sur la vue d'ensemble qui l'empêche de changer de hauteur lorsque vous faites pivoter le périphérique. Autant que je sache, les contraintes de sélection automatique n'apparaissent que si vous avez ajouté des vues par programme, puisqu'un storyboard ou xib est entièrement autolayout ou non. À moins que vous ne fassiez quelque chose comme ajouter une vue mise en page automatique (chargée depuis une nib?) À une autre vue depuis une nib sans autolayout?

94
jrturton

merci à http://useYourLoaf.com pour cette solution complète:

http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html

Un conseil rapide que j'ai trouvé enterré dans une session WWDC 2015 sur la mise en page automatique qui aide lors du débogage de problèmes avec des contraintes

Si vous avez utilisé la disposition automatique, vous serez familiarisé avec le journal généré par Xcode lorsque vous rencontrez un problème. Pour créer un exemple, j'ai modifié mon exemple de code Stack View et ajouté une contrainte à chacune des images pour leur donner une largeur fixe de 240 (pas une bonne idée comme nous le verrons).

 enter image description here

Cela fonctionne dans les vues de largeur régulière telles que l'iPad mais est trop large pour une vue de largeur compacte telle que l'iPhone en portrait. Le journal de la console au moment de l'exécution n'est pas amusant à lire. En sautant le texte normal, vous obtenez une liste des contraintes problématiques:

"<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>",
"<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>",
"<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>",
"<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>",
"<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>",
"<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>",
"<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-|   (Names: '|':UIStackView:0x7fc1ab531a10 )>",
"<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>",
"<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>",
"<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>",
"<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>"

Le journal vous indique ensuite quelles contraintes ci-dessus il a décidé de rompre:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>

La sortie du journal utilise le langage de format visuel de présentation automatique, mais il est difficile de distinguer mes contraintes de celles créées par le système. Ceci est particulièrement le cas avec les vues de pile conçues pour créer la plupart des contraintes pour vous. Dans cet exemple trivial, je connais les contraintes de largeur fixe que je viens d'ajouter, mais il est difficile de voir cela dans le journal et plus la vue est complexe, plus elle devient difficile.

Ajout d'un identifiant à une contrainte

Le journal devient beaucoup plus facile à comprendre si vous ajoutez un identifiant à chaque contrainte (NSLayoutConstraint possède une propriété identifiant depuis iOS 7). Dans Interface Builder, recherchez la contrainte et ajoutez l'identifiant dans l'inspecteur Attributs (j'utilise $ comme préfixe/suffixe pour les distinguer dans le journal):

 enter image description here

Mise à jour du 18 août 2015: comme indiqué dans les commentaires, l'identifiant ne peut être modifié que dans Interface Builder à partir de Xcode 7. Il n'est pas visible dans Xcode 6.4.

Si vous ajoutez la contrainte dans le code:

constraint.identifier = "$HeartImageFixedWidth$"

C'est plus compliqué si vous utilisez le langage de format visuel qui utilise des tableaux de contraintes. Par exemple, considérons le fragment de code Swift pour créer une contrainte de largeur fixe pour la vue d'image coeur:

let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]", 
                 options:[], metrics:nil, views:viewsDictionary)

Puisque heartWidth est un tableau de type [NSLayoutConstraint], l'identifiant est un peu plus fastidieux:

for constraint in heartWidth {
  constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)

Avec identifie mes contraintes, il est maintenant beaucoup plus facile de les trouver dans le fichier journal (voir les quatre premières lignes):

"<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>",
"<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>",
"<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>",
"<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>",
"<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>",
"<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>",
"<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-|   (Names: '|':UIStackView:0x7f92a30472b0 )>",
"<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>",
"<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>",
"<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>",
"<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>"

Il est également beaucoup plus clair de savoir quelles contraintes le système a choisi de supprimer:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>

Ajouter des identifiants à des contraintes demande beaucoup d'efforts, mais cela peut être payant la prochaine fois que vous devez trier le journal de débogage d'une présentation complexe.

Lectures complémentaires

12
Hashem Aboonajmi

Je suppose que ce n’est pas une erreur courante, mais j’ai quelque peu résolu le problème de façon profane. Je recevais des messages cryptés comme celui ci-dessus. Pour lui donner un sens, j'ai créé des classes de vues factices et les ai liées aux vues de mon storyboard. Par exemple, si j'avais un UIView, j'avais créé une classe appelée AddressView et je l'avais attachée à cette vue dans le story board. C'est un peu long, mais cela a fonctionné pour moi. Après cela, au lieu d’identifiants d’objet, j’ai eu les noms de classe, ce qui m’a aidé à cerner très facilement les vues à l’origine du problème. Mon message d'erreur maintenant lu,

2013-07-02 04:16:20.434 Myproject [2908:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (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 and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x9edeae0 V:|-(0)-[AddressView:0x143ee020]   (Names: '|':MainView:0x129eb6a0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x11e998c0 h=--& v=--& V:[MainView:0x129eb6a0(704)]>",
    "<NSLayoutConstraint:0x156720b0 V:[AddressView:0x143ee020]-(896)-|   (Names: '|':MainView:0x129eb6a0 )>"
)

Vous voyez ici que les noms de mes vues MainView et Address view sont à l'origine du problème. 

Pour le résoudre, je viens de déplacer ma sous-vue (dans ce cas, la vue Adresse) et de le repositionner. Je pense que le problème a commencé car j'utilisais un mélange de nouvelles versions de Layour automatique dans Xcode 4.5 et d'anciennes compétences ou de positionnement manuel des vues.

Quoi qu’il en soit, je ne sais pas si c’était plus de la chance que de la diligence, mais cela pourrait quand même être une façon différente de déboguer. Peut-être que cela aide quelqu'un!

9
DrBug

Cela vaut la peine de connaître les bases et de comprendre ce que Apple/Xcode essaie de vous dire à travers les journaux

H = Horizontal constraint(for leading and Trailing)
V = Vertical constraint(top and bottom Edge)
h = height
w = width

TopEdge    -> V:|-(points)-[VIEW:memoryAddress] 
BottomEdge -> V:[VIEW:memoryAddress]-(points)-|
Leading    -> H:|-(points)-[VIEW:memoryAddress] 
Trailing   -> H:[VIEW:memoryAddress] -(points)-|
height     -> h= --& v=--& V:[VIEW:memoryAddress((points)] 
width      -> VIEW:memoryAddress.width == points 
between    -> H:[VIEW 1]-(51)-[VIEW 2] 

Une fois que vous comprenez cela, lire votre erreur spécifique est assez facile

6
Naishta

YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;

L'a fait pour moi.

4
tsuz

J'ai corrigé ce problème en supprimant toutes les propriétés translatesAutoresizingMaskIntoConstraints du fichier xib (ouvrez xib en tant que code source).

3
Danil

Une note. Vous obtenez cette erreur dans les journaux si vous testez à l'aide d'une connexion à un point d'accès personnel et que la barre d'état du point d'accès est en haut. Cela élimine les contraintes.

J'espère que ça aide quelqu'un… me rendait dingue.

2
nab

J'ai eu ce problème et m'a pris 2 jours pour comprendre la source du problème ....

Si vous ouvrez un scénario par programmation dans votre code, assurez-vous de le faire comme suit:

UIStoryboard *story = [UIStoryboard storyboardWithName:@"MovieMaker" bundle:nil];
    UIViewController *vc = [story instantiateInitialViewController];
    //this causes layout to break [self presentViewController:vc animated:YES completion:nil];
    [self showViewController:vc sender:nil];

J'utilisais la ligne commentée (à l'aide de presentViewController) et le bogue d'orientation s'est produit, générant des conflits de contraintes qui n'étaient pas mes contraintes ... changer en showViewController tous les conflits de contraintes ont disparu et l'orientation fonctionne vraiment savoir pourquoi cela fonctionne avec le spectacle et non présent ... pensant toujours que c'est ... ALIENS ...) 

0
rickrvo

Ce problème du message généré "Impossible de satisfaire simultanément les contraintes" dans la console de débogage est également rencontré dans XCode 9.4. 
Dans mon cas particulier sur le simulateur iPad, le message générerait:
1) Uniquement lorsque vous placez le focus sur un UITextField particulier.
2) Même avec toutes les contraintes de vue supprimées.
2) Même avec toutes les contraintes de vue "Réinitialiser aux contraintes suggérées".

Cependant, lorsque le clavier du logiciel est activé, le message ne sera pas généré .. Par conséquent, combien de temps devrais-je passer sur ce problème, qui dans mon cas n'est généré que lorsque le clavier du logiciel est désactivé?.

0
Claytog

Pour moi, cette erreur a été générée lorsque j'ai donné tableView.estimatedRowHeight = UITableViewAutomaticDimension

Cela aurait dû être tableView.estimatedRowHeight = "Some hardcoded value"

0
Ali