约束两个视图以用视觉格式填充屏幕时忽略第二个视图的大小

Second view's size is ignored when constraining two views to fill the screen with visual format

我正在尝试设置一个约束,使两个视图的宽度应填满屏幕。如果我改变一个视图的宽度,另一个视图应该相应地改变:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[view1]-8-[view2]-8-|" options:0 metrics:nil views:views]];

我认为这很简单,但是代码似乎忽略了 view2 的大小。 view1一直获取整个屏幕的宽度,设置view2的frame不影响view1的宽度。

我错过了什么?

也为 view2 分配最小尺寸约束,否则“0 宽度”将是约束的有效解决方案。

[NSLayoutConstraint activateConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[view1(>=minSize)]-8-[view2(>=minSize)]-8-|" 
                                            options:0 
                                            metrics:@{@"minSize" : @50} 
                                              views:views]];

另外,不要再使用 addConstraints: (iOS 8+)。使用 -[NSLayoutConstraint setActive:]+[NSLayoutConstraint activateConstraints:]

至于更改 view2 的大小,您不能在使用自动布局时直接设置视图的框架。该值将在下一个布局过程中被覆盖。您应该为视图创建一个明确的宽度约束:

[NSLayoutConstraint constraintWithItem:view2
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:nil
                             attribute:NSLayoutAttributeNotAnAttribute
                            multiplier:1.0
                              constant:120];

然后在需要更改视图大小时调整该约束的常量。