使用自动布局实现UIPopoverController的自动调整大小

5

我正在尝试使用自动布局来自动调整我的弹出窗口大小以适应其内容。我有一个固定的弹出窗口宽度,但为了计算高度,我依赖于systemLayoutSizeFittingSize:,传入我的预定义宽度和零高度,例如CGSizeMake(190, 0)。

ContentController* controller = [ContentController new];
CGSize preferredSize = [controller.view systemLayoutSizeFittingSize:CGSizeMake(190, 0)];
controller.preferredContentSize = preferredSize;
UIPopoverController* popover = [[UIPopoverController alloc] initWithContentViewController:controller];
//popover presentation.

到目前为止,我的当前ContentController视图层次结构类似于(在Interface Builder中设置):
UILabel - multiline header (dynamically resized)
   |
UIImage with fixed width / height (static size)
   |
UILabel - multiline body (dynamically resized)

因此,我只需插入我的标头/正文文本,调用systemLayoutSizeFittingSize并返回适合视图所有内容的有效大小。

Dynamic height label with short text

Dynamic height label with long text

当我尝试将我的正文标签放在UIScrollView中时(无论是在IB中还是在代码中),问题就出现了。 Dynamic height is broken with scrollview

从现在开始,systemLayoutSizeFittingSize不会考虑正文标签高度,并将返回标头+图像的高度。 我已经在IB中设置了所有约束以支持Pure Autolayout方法。

我已检查scrollview的内容大小-它确实等于正文标签的固有大小,但滚动视图的框架被挤压为0。
我已经检查并尝试重置标签的maxPreferredLayoutWidth到内容视图的宽度,但似乎没有影响任何事情。

我已经将每个视图上的translatesAutoresizingMaskIntoConstraints设置为NO,但没有效果。 我已经将标签及其滚动视图的拉扯/压缩阻力优先级设置为1000,但没有运气。 容器视图上设置它们也不起作用。

以下是我的IB视图设置的屏幕截图:

Label setup

ScrollView with inner label setu

我猜这与弹出窗口托管视图及其自动布局约束有关,但不确定。

我通过简单地更新标签进行更新

_textContainerHeaderLabel.text = headerText;
_textContainerBodyTextLabel.text = bodyText;


[self.view setNeedsUpdateConstraints];
[self.view layoutSubviews];

所以,主要问题是:当视图中有 UIScrollViews 时,如何通过自动布局计算视图的最佳适合大小?
1个回答

4

最终找到了解决这个问题的方法。不知道这是否正确,但我按照以下步骤操作 - 我在标签和它的滚动视图之间添加了高度不等式约束(> = 0)。 技巧是使此约束的优先级低于标签的压缩阻力(在我的情况下为垂直方向)。这似乎解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接