我正在尝试创建一个自定义容器视图,其中包含UIImageView和多行UILabel作为子视图。为了使视图与autolayout完美配合,我将覆盖intrinsicContentSize,如下所示:
- (CGSize)intrinsicContentSize
{
return [self sizeThatFits:self.bounds.size];
}
以sizeThatFits计算的大小具有相同的宽度,并调整高度以便不剪切标签和图像。这很好用,但我很惊讶地在文档中看到以下评论:
此内在大小必须独立于内容框架,因为例如,无法根据更改的高度动态地将更改的宽度传达给布局系统。
如果是这种情况,根据宽度和内容调整视图当前高度的自动布局方式是什么?我应该以不同的方式接近这个吗?
答案 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中的详细信息。