iOS8上的自动布局错误,但iOS9上没有

ppa*_*ojr 5 uikit ios autolayout

我有一个代码,在一个标题中设置一个Autolayout UITableView.这段代码在iOS9上工作正常,但在iOS8上它提出了一个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;
}
Run Code Online (Sandbox Code Playgroud)

辅助方法是:

-(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
             };
}
Run Code Online (Sandbox Code Playgroud)

提出的例外是:

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 )>
Run Code Online (Sandbox Code Playgroud)

查看自动布局的文档我没有发现任何可能影响此代码的从iOS8到iOS9的更改.我错过了什么吗?

fac*_*lla 0

你的问题不是限制本身。至少在您提供给我们的那部分代码中。

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

这种类型的约束是由系统添加的,一旦视图设置完毕,它们就会被删除。我的猜测是,您正在代码中的某个位置强制进行布局传递(例如使用layoutIfNeeded )。如果是这种情况,请将其删除。请改用setNeedsLayout。该方法会将视图标记为MUST_BE_LAYOUTED_IN_THE_NEXT_LAYOUT_PASS但在准备就绪之前不会强制执行它。