2013-11-09 31 views
4

使用自动布局我正在开发一个包含UILabel的容器UIView。我想根据UILabel的高度动态调整容器视图的高度。Autolayout,视图高度取决于子视图高度

我在容器视图中添加了这些约束,但我不知道如何判断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计算的高度和发送度量字典里面的高度。

在视图控制器我还没有指定容器视线的高度让它根据子视图的高度调整:

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

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

我怎样才能使容器视图高度成长为的UILabel高度有增长?

+0

容器视图应该自动调整到适当的高度取决于的UILabel。你确定你已经把标签作为容器的子视图吗?也许发表更多的代码如何设置所有的视图 – Axadiw

+0

是的我很确定视图是在容器视图中,我打印所有的子视图,我可以看到它,虽然帧是(0,0,0,0 )。 – fjbelchi

+0

你是否将所有视图的'translatesAutoresizingMaskIntoConstraints'设置为'NO'? – Axadiw

回答

1

多行文字的intrinsicContentSizeUILabel & NSTextView)不明确。这是因为高度取决于尚未计算的宽度。为了解决这个问题,你必须先允许布局的第一遍,然后设置新增的属性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