web-dev-qa-db-fra.com

Impossible de satisfaire simultanément les contraintes, tentera de récupérer en rompant la contrainte

Ci-dessous se trouve le message d'erreur que je reçois dans la zone de débogage. Il fonctionne bien et rien n’est faux sauf que je reçois cette erreur. Est-ce que cela empêcherait Apple d'accepter l'application? Comment je le répare?

2012-07-26 01:58:18.621 Rolo[33597:11303] 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:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>",
    "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>",
    "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>",
    "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>",
    "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>",
    "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>",
    "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>",
    "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>

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.
125
Johnny Cox

Je recommanderais de déboguer et de trouver quelle contrainte est "celle que vous ne voulez pas". Supposons que vous ayez le problème suivant:

enter image description here

Le problème est toujours de savoir comment trouver les contraintes et les vues suivantes.

Il y a deux solutions pour faire ceci:

  1. DEBUG VIEW HIERARCHY _ ​​(Ne pas recommander de cette façon)

Puisque vous savez où trouver des contraintes inattendues (PBOUserWorkDayHeaderView), il existe un moyen de le faire assez bien. Permet de trouver UIView et NSLayoutConstraint dans des rectangles rouges. Puisque nous connaissons leur id en mémoire, c'est assez simple.

  • Arrêtez l'application en utilisant la hiérarchie de vues Debug:

enter image description here

  • Trouvez le bon UIView:

enter image description here

  • La prochaine étape consiste à trouver NSLayoutConstraint qui nous tient à cœur:

enter image description here

Comme vous pouvez le constater, les pointeurs de mémoire sont les mêmes. Nous savons donc ce qui se passe maintenant. De plus, vous pouvez trouver NSLayoutConstraint dans la hiérarchie des vues. Comme il est sélectionné dans la vue, il est également sélectionné dans le navigateur.

enter image description here

Si vous en avez besoin, vous pouvez également l’imprimer sur la console en utilisant le pointeur adresse:

(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

Vous pouvez faire la même chose pour chaque contrainte que le débogueur vous indiquera :-) Maintenant, vous décidez quoi faire avec cela. 

  1. PRINT IT BETTER _ ​​(Je le recommande vraiment de cette façon, il s'agit de Xcode 7)}

    • définissez un identifiant unique pour chaque contrainte dans votre vue:

 enter image description here

  • créer une extension simple pour NSLayoutConstraint:

Rapide

extension NSLayoutConstraint {

    override public var description: String {
        let id = identifier ?? ""
        return "id: \(id), constant: \(constant)" //you may print whatever you want here
    }
}

OBJECTIF C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • construisez-le encore une fois, et vous avez maintenant une sortie plus lisible pour vous:

 enter image description here

  • une fois que vous avez obtenu votre id, vous pouvez le taper simplement dans votre Navigateur de recherche:

 enter image description here

  • et le trouver rapidement:

 enter image description here

COMMENT SIMPLE FIXER CE CAS?

  • essayez de changer priority en 999 pour la contrainte cassée.
237

Le problème que vous rencontrez est le NSAutoresizingMaskLayoutConstraints ne devrait pas être là. C'est l'ancien système de ressorts et d'entretoises. Pour vous en débarrasser, exécutez cette méthode sur chaque vue que vous souhaitez contraindre:

[view setTranslatesAutoresizingMaskIntoConstraints:NO];
102
David Wong

Faites attention , de ne pas utiliser plus d'une contrainte dans le même sens et le même type.

Par exemple: Contrainte verticale pour fin = 15 et un autre => 10.

Parfois, Xcode crée des contraintes que vous ne remarquez pas . Vous devez vous débarrasser des contraintes redondantes et l'avertissement du journal disparaîtra sûrement.

enter image description here

En outre, vous pouvez lire et détecter certaines raisons, directement depuis le journal :

NSLayoutConstraint: 0xa338390 V: | - (15) - [UILabel: 0xa331260] (Noms: '|': UILabel: 0xa330270)>

Ceci peut être lu comme un problème dans la contrainte UILabel, elle est en avance sur une contrainte verticale longue de 15 pt.

NSLayoutConstraint: 0x859ab20 H :-( 13) - | [UIView: 0x85a8fb0] ...

Ce serait une contrainte horizontale de fuite, etc.

28
pedrouan

Un grand nombre de ces exceptions ont été lancées. Le moyen le plus rapide et le plus simple que j'ai trouvé pour les résoudre était de trouver des valeurs uniques dans les exceptions que j'avais ensuite recherchées dans le code source du storyboard. Cela m'a aidé à trouver les vues et contraintes réelles à l'origine du problème (j'utilise des étiquettes utilisateur significatives sur toutes les vues, ce qui facilite beaucoup le suivi des contraintes et des vues) ...

Donc, en utilisant les exceptions ci-dessus, j'ouvrirais le storyboard en tant que "code source" dans xcode (ou un autre éditeur) et chercherais quelque chose que je pourrais trouver ...

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

.. cela ressemble à une contrainte verticale (V) sur un UILabel avec une valeur de (17).

En parcourant les exceptions, je trouve aussi 

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

Ce qui ressemble à UILabel (0x72bf7c0) est proche d’un UIButton (0x886efe0) avec un espacement vertical (8) ..

J'espère que cela me suffira pour trouver les vues spécifiques dans le code source du storyboard (probablement en cherchant initialement le texte "17"), ou du moins quelques candidats probables. À partir de là, je devrais être en mesure de déterminer les vues dans le storyboard qui faciliteront grandement l'identification du problème (recherchez un épinglage "dupliqué" ou en conflit qui est en conflit avec des contraintes de taille). 

6
C James

J'ai eu ce problème parce que mes fichiers .xib utilisaient autolayout.

Dans l'inspecteur de fichier, premier onglet. Décocher "Utiliser Autolayout" a résolu le problème.

autolayout file inspector

6

J'ai eu du mal à comprendre quelles contraintes étaient à l'origine de cette erreur. Voici un moyen plus simple de le faire. 

J'utilise Xcode 6.1.1

  1. "Commande + A" pour sélectionner toutes les étiquettes UIL, UIImages, etc. 
  2. Cliquez sur Editeur -> Épingler> (Sélectionner ...) pour créer un aperçu.
  3. cliquez à nouveau sur Editeur -> Résoudre les problèmes de mise en page automatique -> Ajouter des contraintes manquantes ou Réinitialiser les contraintes suggérées. Cela dépend de votre cas.
6
Ronaldoh1

Voici mon expérience et solution . Je n'ai pas touché le code

  1. Sélectionnez une vue (UILabel, UIImage, etc.)
  2. Éditeur> Épingler> (Sélectionner ...) dans Superview
  3. Editeur> Résoudre les problèmes de mise en page automatique> Ajouter des contraintes manquantes
4
royemi

utiliser Swift ce code

view.translatesAutoresizingMaskIntoConstraints = false
4
Arun Kumar P

J'ai suivi SO questions et réponses à chaque recherche. Mais ils sont tous liés à un spécifique.

À la base, je veux dire avant que vous n'écriviez un format (peut-être simple), cela vous donnera un avertissement.

Depuis iOS 8.0, les vues par défaut sont des classes de taille. Même si vous désactivez les classes de taille, il contiendra toujours des contraintes de mise en page automatique.

Donc, si vous prévoyez de définir des contraintes via du code en utilisant VFL. Ensuite, vous devez prendre soin d'une ligne en dessous.

// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];

J'avais beaucoup cherché dans SO, mais la solution était dans Apple Sample Code

Vous devez donc supprimer les contraintes par défaut avant de planifier l’ajout de nouvelles.

2
Kampai

Pour moi, la principale raison de ce problème est que j'ai oublié de décocher AutoLayout dans l'éditeur Xib . En fait, j'ai effectué beaucoup d'ajustements de la XIB dans le code.

1
giuseppe
 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

Cela m'a aidé à comprendre le problème.

1
Grant Carlisle

Aucune des réponses précédentes n'est utile dans mon cas. J'utilise XCode 10.1 et teste mon application sur le simulateur pour un "iPad (5ème génération)". Le simulateur exécute iOS 12.1.

J'ai une vue racine simple dans mon scénario, avec deux sous-vues UITextField. Il n'y a aucune contrainte utilisée dans le storyboard. Et je n'ai aucun objet UIButtonBarView dans l'application ou le storyboard.

Aucun message n'est imprimé lorsque l'application démarre et affiche la vue racine. Aucune lors de la rotation du périphérique simulé.

Mais dans le simulateur, au moment où je clique sur l'un des champs de texte, l'extension du clavier provient du bas de l'écran, mais pas du clavier complet, qui ne semble jamais apparaître dans le simulateur. Mais ce qui suit est imprimé sur le terminal:

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:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Il me semble certainement que tout cela n'a à voir avec rien dans mon application, et tout à voir avec la façon dont Apple crée sa propre vue de clavier, même avec ma petite extension déclarée pour être combinée à celle-ci.

Donc, la question demeure: y at-il quelque chose que je suis responsable de faire (en partant du principe que cela vaut la peine d’être traité) ou s’agit-il uniquement du problème/bogue d’Apple?

FWIW, ce message de problème de contrainte ne se produit pas lors de la simulation d'un modèle d'iPad plus récent, tel que l'iPad Pro 12,9 pouces (3ème génération). Mais le message apparaît lors de la simulation d'un iPad Pro 9,7 pouces ". Tous prétendent qu'ils utilisent iOS 12.1.

0
jsbox

Swift 4

Je viens d'ajouter cette ligne dans viewDidLoad et fonctionne bien avec moi.

view.removeConstraints(view.constraints)
0
Faris