I have code that sets Autolayout in a UITableView header. This code works fine on iOS9, but on iOS8 it calls UIViewAlertForUnsatisfiableConstraints .
-(NSArray *)layoutConstraints { NSMutableArray * result = [NSMutableArray array]; NSDictionary * views = [self views]; NSDictionary * metrics = [self metrics]; [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[section]-20-|" options:0 metrics:nil views:views]]; [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[section]|" options:0 metrics:nil views:views]]; [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[subtitleLabel]-20-|" options:0 metrics:nil views:views]]; [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[titleLabel]-20-|" options:0 metrics:metrics views:views]]; [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[sectionContainer]|" options:0 metrics:nil views: views]]; [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[sectionContainer(section_heigth)]-[subtitleLabel]-[titleLabel]-20-|" options:0 metrics:metrics views:views]]; return result; }
Helper Methods:
-(NSDictionary *)views { return @{ @"sectionContainer": self.sectionContainer, @"section": self.section, @"subtitleLabel": self.subtitleLabel, @"titleLabel": self.titleLabel }; } -(NSDictionary *)metrics { return @{@"section_heigth" : @(HEIGHT_FOR_HEADER_IN_SECTION), @"margin" :@20 }; }
The exception is:
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:0x1b954150 H:|-(20)-[UILabel:0x12834d40'Ability to Round'] (Names: '|':_UITableViewHeaderFooterContentView:0x239a5510 )>", "<NSLayoutConstraint:0x1b954190 H:[UILabel:0x12834d40'Ability to Round']-(20)-| (Names: '|':_UITableViewHeaderFooterContentView:0x239a5510 )>", "<NSLayoutConstraint:0x1b94f390 'UIView-Encapsulated-Layout-Width' H:[_UITableViewHeaderFooterContentView:0x239a5510(0)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1b954190 H:[UILabel:0x12834d40'Ability to Round']-(20)-| (Names: '|':_UITableViewHeaderFooterContentView:0x239a5510 )>
Having looked in the documentation for automatic layout, I did not find anything that changed from iOS8 to iOS9, which could affect this code. Did I miss something?
source share