UIView的动态高度使用intrinsicContentSize

时间:2013-09-27 15:44:26

标签: ios objective-c cocoa-touch uiview autolayout

我正在尝试创建一个自定义容器视图,其中包含UIImageView和多行UILabel作为子视图。为了使视图与autolayout完美配合,我将覆盖intrinsicContentSize,如下所示:

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

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

  

此内在大小必须独立于内容框架,因为例如,无法根据更改的高度动态地将更改的宽度传达给布局系统。

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

内在大小不应与内容框架相关,而只与其自身的子内容相关。 例如你的图像和UILabel。

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

只是我的意见......

答案 2 :(得分: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)
    ...
}

答案 3 :(得分:-1)

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

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

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