自动布局,视图高度根据子视图高度而定

4

我正在使用自动布局来开发一个包含UILabel的容器UIView。我想使容器视图的高度根据UILabel的高度动态变化。

我正在容器视图中添加这些约束条件,但是我不知道如何获取UILabel的高度,因为它是多行UILabel。

- (void) updateConstraints{

[self removeConstraints:self.constraints];

NSDictionary *views = NSDictionaryOfVariableBindings(_informationLabel);

// -- Constraints

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[_informationLabel]-5-|"
                                                             options:0
                                                             metrics:@{}
                                                               views:views]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_informationLabel]-5-|"
                                                             options:0
                                                             metrics:@{}
                                                               views:views]];
[super updateConstraints];}

我尝试使用boundingRectWithSize计算高度,并将高度发送到度量字典中。

在ViewController中,我没有指定容器视图的高度,以便它根据子视图的高度进行调整:

[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[_informationView]"
                                                                         options:0
                                                                         metrics:@{}
                                                                           views:views]];

[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_informationView]-|"
                                                                         options:0
                                                                         metrics:@{}
                                                                           views:views]];

我应该如何让容器视图的高度随uilabel高度的增长而增长?

容器视图应根据UILabel自动调整到适当的高度。您确定已将标签设置为容器的子视图吗?也许可以发布更多代码,以了解您如何设置所有视图。 - Axadiw
是的,我非常确定该视图在容器视图内,我打印了所有子视图,虽然该视图的框架为(0,0,0,0),但我可以看到它。 - fjbelchi
你是否为所有视图设置了translatesAutoresizingMaskIntoConstraintsNO - Axadiw
@Axadiw 是的,适用于所有视图和子视图。 - fjbelchi
你很可能在容器中有另一个子项阻止了该调整大小。比如一个具有固定高度、带有上间距和下间距约束的图像。 - Ehab Amer
1个回答

1
多行文本(UILabel和NSTextView)的intrinsicContentSize是不明确的。这是因为高度取决于尚未计算的宽度。要解决此问题,您必须允许第一次布局,然后设置新添加的属性preferredMaxLayoutWidth,该属性专门解决此问题。
// Inside superview
- (void)layoutSubviews
{
  [super layoutSubviews];
  self.informationLabel.preferredMaxLayoutWidth = self.informationLabel.frame.size.width;
  [super layoutSubviews];
}

来源:http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接