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.
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:
Le problème est toujours de savoir comment trouver les contraintes et les vues suivantes.
Il y a deux solutions pour faire ceci:
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.
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.
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.
PRINT IT BETTER _ (Je le recommande vraiment de cette façon, il s'agit de Xcode 7)}
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
id
, vous pouvez le taper simplement dans votre Navigateur de recherche:COMMENT SIMPLE FIXER CE CAS?
999
pour la contrainte cassée.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];
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.
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.
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).
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.
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
Voici mon expérience et solution . Je n'ai pas touché le code
utiliser Swift ce code
view.translatesAutoresizingMaskIntoConstraints = false
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.
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.
for(UIView *view in [self.view subviews]) {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
Cela m'a aidé à comprendre le problème.
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.
Swift 4
Je viens d'ajouter cette ligne dans viewDidLoad et fonctionne bien avec moi.
view.removeConstraints(view.constraints)