2013-04-15 2 views
2

J'ai le code de test simple suivant dans mon contrôleur:Autolayout conflit de contrainte lorsque je spécifie une seule contrainte

- (void)loadView 
{ 
    UIView *view = [UIView new]; 
    [self setView:view]; 

    UILabel *label = [UILabel new]; 
    [label setText:@"Hello World!"]; 

    [view addSubview:label]; 

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[label]" 
     options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)]]; 
} 

Le code échoue à l'exception suivante et je ne peux pas comprendre pourquoi. Toute aide serait grandement appréciée:

2013-04-15 14:15:47.880 libmarkup-test[1072: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:0x753eb60 H:|-(NSSpace(20))-[UILabel:0x7536b60] (Names: '|':UIView:0x75376a0)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x712a2c0 h=--& v=--& UILabel:0x7536b60.midX ==>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x753eb60 H:|-(NSSpace(20))-[UILabel:0x7536b60] (Names: '|':UIView:0x75376a0)> 

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. 

Le message « incapable de satisfaire simultanément les contraintes » est particulièrement déroutant puisque, pour autant que je peux dire, je ne spécifier une contrainte.

+0

Pour une raison quelconque, la question a été postée avant que j'aie fini de l'écrire. –

+0

Greg: où définissez-vous le cadre de la vue? et pourquoi utilisez-vous setView? Voulez-vous ajouter cette vue que vous créez en tant que sous-vue pour un contrôleur? Je ne suis pas sûr que nous avons assez d'informations pour vous aider. –

+0

Je ne suis pas en train de régler le cadre de la vue - je le règle comme vue pour mon contrôleur. Le contrôleur le dimensionne pour remplir l'écran. Ce code est en cours d'exécution dans loadView. J'ai ajouté plus de contexte à l'exemple de code. –

Répondre

6

Il semble que vous ayez oublié de définir translatesAutoresizingMaskIntoConstraints sur l'UILabel. Par défaut, ce sera OUI. Ainsi, le masque d'autoresizing sur cette étiquette est traduit en contraintes supplémentaires, qui sont alors en conflit avec celui que vous avez spécifié.

Ajout cela devrait résoudre le problème contrainte:

label.translatesAutoresizingMaskIntoConstraints = NO;

Vous devriez probablement penser à une des contraintes verticales sur cette étiquette ainsi.

Espérons que ça aide.

+0

En fait, j'ai inclus le texte entier du message d'erreur. –

+0

avant et après "Will tenter to recover ...", vous ne voyez pas une liste de contraintes? Vous devriez voir au moins un après, et au moins deux avant cette ligne. –

+0

Je fais ... On dirait que l'éditeur a traité cette partie en tant que balisage, cependant, il n'est donc pas apparu. Je viens de reformater le message pour que vous puissiez le voir. –

Questions connexes