【问题标题】:UIView with dynamic height that uses intrinsicContentSizeUIView 具有使用intrinsicContentSize 的动态高度
【发布时间】:2013-10-03 23:53:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果要避免内容被剪裁,必须提高容器视图的抗压缩优先级。
  • 抗压缩是视图抵抗被制作成小于其固有内容大小的优先级。如果内在内容大小不正确,那么这将没有多大用处。

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


【解决方案1】:

我认为文档的意思是,您的 containerView 可能有一个 placeHolderFrame 作为内容框架。

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

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

只是我的看法...

【讨论】:

  • 什么是placeHolderFrame?就此而言,什么是内容框架?该标签是一个多行标签,如果不先知道视图必须将文本包装到多少宽度,就不可能知道它的高度。
【解决方案2】:

我猜你可以使用 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)
    ...
}

【讨论】:

  • 这里的问题不是如何正确布局视图,而是告诉布局系统视图的固有高度,以便根据其内容赋予正确的高度。
  • 我的观点是关于标签的内在 contentSize。使用preferredMaxLayoutWidth,它可以以更自动布局友好的方式进行更新(也许苹果建议这样做)。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 是的,似乎 Autolayout 几乎没有帮助来完成它。您的回答让我想到了我们在 preferredMaxLayoutWidth > 0.0f 时限制视图宽度的方法,否则实际上不限制 - 在内部内容大小计算中使用大浮点数(例如 99999.0f)作为宽度。
    猜你喜欢
    • 2016-08-05
    • 2013-07-04
    • 2016-03-18
    • 2021-06-13
    • 2019-01-26
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多