Auto-linking error on iOS8 but not on iOS9

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?

+5
source share
1 answer

Your problem here is not the limitations themselves. At least in that part of the code that you provided to us.

  "<NSLayoutConstraint:0x1b94f390 'UIView-Encapsulated-Layout-Width' H:[_UITableViewHeaderFooterContentView:0x239a5510(0)]>" 

This type of constants is added by the system, and they are deleted after the view is already configured. I assume that you are forcing to pass the layout somewhere in your code (e.g. layoutIfNeeded ). If this happens, delete it. Use setNeedsLayout instead . This method will mark the view as MUST_BE_LAYOUTED_IN_THE_NEXT_LAYOUT_PASS , but will not force it until ready.

0
source

Source: https://habr.com/ru/post/1239071/


All Articles