在自动布局中使用UILabel

我无法通过自动布局实现一些非常基本的布局行为。 我的视图控制器在IB中看起来像这样:

最上面的标签是标题标签,我不知道它会有多少行。 我需要标题标签来显示所有文本行。 我还需要另外两个标签和小图片放在标题下方,然而它恰好是高的。 我在标签和小图像之间设置了垂直间距约束,以及标题标签和其超视图之间的顶部间距约束以及小图像和其超视图之间的底部间距约束。 白色的UIView没有高度约束,所以它应该垂直拉伸以包含它的子视图。 我已将标题标签的行数设置为0。

我如何获得标题标签来调整大小以适应字符串所需的行数? 我的理解是我不能使用setFrame方法,因为我使用自动布局。 而且我必须使用自动布局,因为我需要这些其他视图留在标题标签下面(因此是约束条件)。

我怎样才能做到这一点?


使用UILabel上的-setPreferredMaxLayoutWidth和自动布局应该处理剩下的事情。

[label setPreferredMaxLayoutWidth:200.0];

请参阅UILabel文档。

更新:

只需要将故事板中的高度约束设置为大于或等于“,不需要setPreferredMaxLayoutWidth。


将标签集行数扩展为0,对于自动布局集高度>> x更重要。 自动布局将完成剩下的工作。 您也可以根据之前的元素包含您的其他元素以正确定位。

自动布局


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

多行文本的固有内容大小

对于多行文本,UILabel和NSTextField的内在内容大小不明确。 文本的高度取决于线条的宽度,这在解决约束时尚未确定。 为了解决这个问题,两个类都有一个名为preferredMaxLayoutWidth的新属性,它指定了用于计算内在内容大小的最大行宽。

由于我们通常不会提前知道这个值,所以我们需要采取两步走的方法才能做到这一点。 首先,我们让自动布局执行其工作,然后使用布局过程中的结果帧再次更新首选最大宽度和触发布局。

- (void)layoutSubviews
{
    [super layoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [super layoutSubviews];
}

第一次调用[super layoutSubviews]对于标签获取其框架是必要的,而第二次调用是在更改后更新布局所必需的。 如果我们忽略第二次调用,我们会得到一个NSInternalInconsistencyException错误,因为我们在布局过程中进行了更改,这需要更新约束,但是我们没有再次触发布局。

我们也可以在标签子类本身中做到这一点:

@implementation MyLabel
- (void)layoutSubviews
{
    self.preferredMaxLayoutWidth = self.frame.size.width;
    [super layoutSubviews];
}
@end

在这种情况下,我们不需要首先调用[super layoutSubviews],因为当layoutSubviews被调用时,我们已经在标签本身上有一个框架。

为了从视图控制器级别进行这种调整,我们钩入viewDidLayoutSubviews。 此时,第一个自动布局过程的帧已经设置好了,我们可以使用它们来设置首选的最大宽度。

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [self.view layoutIfNeeded];
}

最后,请确保您的标签具有比标签的内容压缩抵抗优先级更高的优先级,并且没有明确的高度限制。 否则,它会超过内容的计算高度。 确保检查所有可能影响标签高度的限制。

链接地址: http://www.djcxy.com/p/4843.html

上一篇: line UILabel in Auto Layout

下一篇: Top aligned UILabel, make text stick to top of label view