Note that there are some explanatory texts on larger screens.

plurals
  1. POAuto Layout Constraints Throwing Exception
    text
    copied!<p>I am using auto layouts on fields I am loading into table view cells. For each cell I clear all subviews out of the contentView and load my own views based on the type of field I need. Most cells are fine, but when this one comes into view, I get an exception.</p> <p>Here is the code for the cell:</p> <pre><code>UILabel *questionText = [[UILabel alloc] init]; questionText.text = self.field.questionText; questionText.font = font; questionText.numberOfLines = 0; questionText.adjustsFontSizeToFitWidth = NO; questionText.lineBreakMode = NSLineBreakByWordWrapping; [questionText setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.contentView addSubview:questionText]; UIView *listContainer = [[UIView alloc] init]; listContainer.backgroundColor = [UIColor whiteColor]; listContainer.layer.cornerRadius = 8; listContainer.layer.borderWidth = 1.0; [listContainer setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.contentView addSubview:listContainer]; // Get the views dictionary NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(questionText, listContainer); //Create the constraints using the visual language format NSString *format = @"V:|-10-[questionText]-10-[listContainer]-10-|"; NSArray *constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:format options:NSLayoutFormatAlignAllLeft metrics:nil views:viewsDictionary]; [self.contentView addConstraints:constraintsArray]; format = @"|-10-[questionText]-10-|"; constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:format options:NSLayoutFormatAlignAllLeft metrics:nil views:viewsDictionary]; [self.contentView addConstraints:constraintsArray]; format = @"|-10-[listContainer]-10-|"; constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:format options:NSLayoutFormatAlignAllLeft metrics:nil views:viewsDictionary]; [self.contentView addConstraints:constraintsArray]; ToggleButton *prevCheckbox; ToggleButton *checkbox; for (AssessmentAnswer *answer in self.field.answers) { checkbox = [[ToggleButton alloc] initWithText:answer.text ofType:ToggleButtonTypeCheckbox]; [checkbox setTranslatesAutoresizingMaskIntoConstraints:NO]; [listContainer addSubview:checkbox]; viewsDictionary = NSDictionaryOfVariableBindings(checkbox); format = @"|-10-[checkbox]-10-|"; constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:format options:NSLayoutFormatAlignAllCenterY metrics:nil views:viewsDictionary]; [listContainer addConstraints:constraintsArray]; if (prevCheckbox) { // This is not the first item [listContainer addConstraint:[NSLayoutConstraint constraintWithItem:checkbox attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:prevCheckbox attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20.0]]; } else { // This is the first item [listContainer addConstraint:[NSLayoutConstraint constraintWithItem:checkbox attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:listContainer attribute:NSLayoutAttributeTop multiplier:1.0 constant:10.0]]; } prevCheckbox = checkbox; } if (checkbox) { // This is the last checkbox [listContainer addConstraint:[NSLayoutConstraint constraintWithItem:listContainer attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:checkbox attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10.0]]; } </code></pre> <p>In this case, there is only one item in <code>self.field.answers</code>. Font is the same value as what is used below.</p> <p>Here is the code for the cell height:</p> <pre><code>UIFont *font = [UIFont fontWithName:@"Helvetica" size:14.0]; //Find height of question text CGFloat questionTextHeight = [field.questionText sizeWithFont:font constrainedToSize:CGSizeMake(width - (2 * PAD_X), CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; //Find height of each row CGFloat listHeight = 0.0; for (AssessmentAnswer *answer in field.answers) { listHeight += MAX([answer.text sizeWithFont:font constrainedToSize:CGSizeMake(width - 43.0 - [ToggleButton getImageWidth], CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height, [ToggleButton getImageHeight]) + 20.0; } // Question text height + list height + spacers return questionTextHeight + listHeight + 30.0; </code></pre> <p>Here is the code that creates the insides of a ToggleButton, which is a UIButton:</p> <pre><code>for (UIView *subview in self.subviews) { [subview removeFromSuperview]; } // Add the toggle button image self.toggleImgView = [[UIImageView alloc] init]; [self.toggleImgView setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:self.toggleImgView]; // Add the label self.toggleLabel = [[UILabel alloc] init]; self.toggleLabel.font = [UIFont fontWithName:@"Helvetica" size:14.0f]; self.toggleLabel.numberOfLines = 0; self.toggleLabel.adjustsFontSizeToFitWidth = NO; self.toggleLabel.lineBreakMode = NSLineBreakByWordWrapping; self.toggleLabel.backgroundColor = [UIColor clearColor]; [self.toggleLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:self.toggleLabel]; // Get the views dictionary NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_toggleImgView, _toggleLabel); //Create the constraints using the visual language format NSString *format = [NSString stringWithFormat:@"|-0-[_toggleImgView(%f)]-3-[_toggleLabel]-0-|", IMAGE_WIDTH]; NSArray *constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:format options:nil metrics:nil views:viewsDictionary]; [self addConstraints:constraintsArray]; viewsDictionary = NSDictionaryOfVariableBindings(_toggleLabel); format = [NSString stringWithFormat:@"V:|-0-[_toggleLabel(&gt;=%f)]-0-|", IMAGE_HEIGHT]; constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:format options:NSLayoutFormatAlignAllLeft metrics:nil views:viewsDictionary]; [self addConstraints:constraintsArray]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.toggleImgView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.toggleImgView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.toggleImgView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.toggleLabel attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]]; </code></pre> <p>Here is the exception readout I am getting:</p> <pre><code>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) ( "&lt;NSLayoutConstraint:0x1f28c4f0 V:[UILabel:0x1f288f10(&gt;=27)]&gt;", "&lt;NSLayoutConstraint:0x1f291460 V:[ToggleButton:0x1f068e50]-(10)-| (Names: '|':UIView:0x1f0182a0 )&gt;", "&lt;NSLayoutConstraint:0x1f293830 V:[UILabel:0x1f288f10]-(0)-| (Names: '|':ToggleButton:0x1f068e50 )&gt;", "&lt;NSLayoutConstraint:0x1f28b480 V:|-(10)-[UILabel:0x1f062890] (Names: '|':UITableViewCellContentView:0x1f1c23d0 )&gt;", "&lt;NSLayoutConstraint:0x1f29b070 V:|-(10)-[ToggleButton:0x1f068e50] (Names: '|':UIView:0x1f0182a0 )&gt;", "&lt;NSLayoutConstraint:0x1f289810 V:[UIView:0x1f0182a0]-(10)-| (Names: '|':UITableViewCellContentView:0x1f1c23d0 )&gt;", "&lt;NSLayoutConstraint:0x1f292eb0 V:|-(0)-[UILabel:0x1f288f10] (Names: '|':ToggleButton:0x1f068e50 )&gt;", "&lt;NSLayoutConstraint:0x1f28dc90 V:[UILabel:0x1f062890]-(10)-[UIView:0x1f0182a0]&gt;", "&lt;NSAutoresizingMaskLayoutConstraint:0x1f1e5ed0 h=--&amp; v=--&amp; V:[UITableViewCellContentView:0x1f1c23d0(60)]&gt;" ) Will attempt to recover by breaking constraint &lt;NSLayoutConstraint:0x1f293830 V:[UILabel:0x1f288f10]-(0)-| (Names: '|':ToggleButton:0x1f068e50 )&gt; Break on objc_exception_throw to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; may also be helpful. </code></pre> <p>I don't get why I am getting the exception because all the heights add up. This scenario is happening with a few other cell types so any insight would be helpful.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload