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

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

我想要的是灰色显示的容器视图的大小增加或减少,具体取决于标签中的文本数量.

到目前为止,我已经设法使布局完全按照我无法解决一个小问题的描述工作.我遇到的问题是标签的固有高度总是用标签的原始宽度(例如在界面构建器中设置的那个)计算,而不是根据我在其上的约束设置的标签的宽度.

我对视图的约束如下:

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

所有这些约束共同创建了所需的布局.

然而:

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

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

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

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

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

任何建议将不胜感激.

解决方法

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

“界面”构建器将preferredMaxLayoutWidth设置为具有初始标签宽度.希望这可以帮助.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...