如何使用Autolayout创建基于UILabel内容扩展高度的布局

时间:2012-09-21 12:19:09

标签: uilabel ios6 autolayout

我正在尝试使用iOS 6.0中的新autolayout api构建动态布局。我尝试构建的布局有2个按钮,它们之间有一个标签,如下图所示:

enter image description here

我想要的是以灰色显示的容器视图,根据标签中的文字数量增加或减少尺寸。

到目前为止,我已设法让布局完全按照我所解释的一个小问题所描述的方式工作。我遇到的问题是标签的固有高度总是用标签的原始宽度(例如,界面构建器中设置的那个)计算,而不是根据我对它的约束设置的标签的宽度。

我对视图的约束如下:

  • H:| - [leftButton] - [标号] - [rightButton] - |
  • 两个按钮都垂直居中
  • V:| - [label] - |
  • 按钮的内容拥抱优先级高于标签
  • 标签的压缩阻力高于容器视图

所有这些约束共同创造了所需的布局。

然而:

  • 如果界面构建器中的标签宽度(界面构建器中的文字大小)小于运行时视图的宽度,则容器的高度太大。

enter image description here

为了帮助澄清这一点,以上布局的IB视图如下(注意更窄)

enter image description here

  • 如果界面构建器中标签的宽度(界面构建器中的文字大小)大于运行时视图的宽度,则容器的高度太小,文本行会被切断。

似乎正在发生的事情是,尽管标签宽度没有约束,但标签似乎根据标签创建时的原始宽度计算其高度(以及自动布局计算的容器高度) 。然而,有什么奇怪的是,文本似乎是正确的宽度和高度,但标签本身有一个太大或太小的框架。

我想这与事情发生的顺序有关,并且尝试在containerViews layoutSubview方法中调用updateConstraintsIfNeeded但是这似乎没有做任何事情。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:10)

可能是我迟到了,但无论如何我找到了解决办法。任何时候更改标签宽度时,您需要手动更新Label的preferredMaxLayoutWidth。例如:

Label.preferredMaxLayoutWidth = 200;

“接口”构建器将preferredMaxLayoutWidth设置为具有初始标签宽度。 希望这会有所帮助。

答案 1 :(得分:0)

您是否尝试在标签上调用-invalidateIntrinsicContentSize?

答案 2 :(得分:0)

是的,-invalidateIntrinsicContentSize也可用于此目的。

  1. 制作一个自定义类,如'CustomLabel'。
  2. 在界面构建器中为UILabel设置此类。
  3. 覆盖返回IntrinsicContentSize

    的函数
    -(CGSize)intrinsicContentSize {
    //If the width is Zero.
    if (self.frame.size.width == 0) {
        return [super intrinsicContentSize];
    }
    
    return [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(self.frame.size.width, MAXFLOAT)];
    }
    
  4. 通知系统,通过调用方法重新计算它的内在大小。 [CustomLabel invalidateIntrinsicContentSize];

  5. 希望这会有所帮助。