我正在尝试使用iOS 6.0中的新autolayout api构建动态布局。我尝试构建的布局有2个按钮,它们之间有一个标签,如下图所示:
我想要的是以灰色显示的容器视图,根据标签中的文字数量增加或减少尺寸。
到目前为止,我已设法让布局完全按照我所解释的一个小问题所描述的方式工作。我遇到的问题是标签的固有高度总是用标签的原始宽度(例如,界面构建器中设置的那个)计算,而不是根据我对它的约束设置的标签的宽度。
我对视图的约束如下:
所有这些约束共同创造了所需的布局。
然而:
为了帮助澄清这一点,以上布局的IB视图如下(注意更窄)
似乎正在发生的事情是,尽管标签宽度没有约束,但标签似乎根据标签创建时的原始宽度计算其高度(以及自动布局计算的容器高度) 。然而,有什么奇怪的是,文本似乎是正确的宽度和高度,但标签本身有一个太大或太小的框架。
我想这与事情发生的顺序有关,并且尝试在containerViews layoutSubview方法中调用updateConstraintsIfNeeded但是这似乎没有做任何事情。
任何建议都将不胜感激。
答案 0 :(得分:10)
可能是我迟到了,但无论如何我找到了解决办法。任何时候更改标签宽度时,您需要手动更新Label的preferredMaxLayoutWidth。例如:
Label.preferredMaxLayoutWidth = 200;
“接口”构建器将preferredMaxLayoutWidth设置为具有初始标签宽度。 希望这会有所帮助。
答案 1 :(得分:0)
您是否尝试在标签上调用-invalidateIntrinsicContentSize?
答案 2 :(得分:0)
是的,-invalidateIntrinsicContentSize
也可用于此目的。
覆盖返回IntrinsicContentSize
的函数-(CGSize)intrinsicContentSize {
//If the width is Zero.
if (self.frame.size.width == 0) {
return [super intrinsicContentSize];
}
return [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(self.frame.size.width, MAXFLOAT)];
}
通知系统,通过调用方法重新计算它的内在大小。
[CustomLabel invalidateIntrinsicContentSize];
希望这会有所帮助。