11

我正在尝试创建一个自定义容器视图,该视图具有 UIImageView 和多行 UILabel 作为子视图。为了使视图与自动布局很好地配合使用,我将覆盖intrinsicContentSize,如下所示:

- (CGSize)intrinsicContentSize
{
    return [self sizeThatFits:self.bounds.size];
}

在 sizeThatFits 中计算的尺寸具有相同的宽度,并调整高度以使标签和图像不被剪裁。这很好用,但我很惊讶在文档中看到以下评论:

这个固有尺寸必须独立于内容框架,因为例如,无法根据改变的高度动态地将改变的宽度传达给布局系统。

如果是这种情况,根据宽度和内容调整视图当前高度的自动布局方式是什么?我应该以不同的方式解决这个问题吗?

4

4 回答 4

7

要回答我自己的问题,似乎没有适合这种情况的自动布局解决方案。寻找UILabel灵感,这里的问题已经通过添加属性解决了preferredMaxLayoutWidth,然后可以在计算内在内容大小时将其用作约束宽度。任何自定义视图都需要使用类似的东西。

于 2014-02-17T21:32:18.400 回答
1

我认为文档意味着,您containerView可能有一个placeHolderFrame内容框架。

内在大小不应与内容框架相关,而应仅与它自己的子内容相关。例如,您的图像和 UILabel。

您应该根据标签和图像计算高度和宽度。这应该很容易,因为它们都有内在的大小。

只是我的观点...

于 2013-09-27T15:54:32.090 回答
0

我想您可以使用 UILabel 的新preferredMaxLayoutWidth属性正确布局标签并使用其他方法来布局其他内容。

像这样的东西:

- (void)layoutSubviews
{
    ...
    [super layoutSubviews]; // get width from solved constraints
    label.preferredMaxLayoutWidth = label.frame.size.width; // use it
    [super layoutSubviews]; // update height of a label (probably intrinsicContentSize)
    ...
}
于 2013-11-11T04:20:54.973 回答
-1

将包含视图的底部边缘与图像和标签对齐。

[self alignBottomEdgeWithView:labelView predicate:@"10"];

http://code.dblock.org/ios-uiview-with-an-image-and-text-with-dynamic-height中的详细信息。

于 2014-02-03T13:41:30.783 回答