我正在尝试使用自动布局来自动调整弹出窗口的大小以适合其内容。我有固定的popover宽度,但是要计算高度,我依赖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.
Run Code Online (Sandbox Code Playgroud)
到目前为止,到目前为止,我当前的ContentController视图层次结构类似于(在Interface Builder中设置):
UILabel - multiline header (dynamically resized)
|
UIImage with fixed width / height (static size)
|
UILabel - multiline body (dynamically resized)
Run Code Online (Sandbox Code Playgroud)
因此,我只是插入标题/正文文本,调用systemLayoutSizeFittingSize,它会返回适合视图所有内容的有效大小。


当我尝试将身体标签放在UIScrollView中时,就会出现问题。(在IB和代码中)。

从现在开始,systemLayoutSizeFittingSize将不再考虑正文标签的高度,并将返回页眉+图片的高度。我已经在IB中设置了所有约束以支持Pure Autolayout方法。
我已经检查了scrollview的内容大小-它确实等于主体标签的固有大小,但是滚动视图的框架被压缩为0。
我已经检查并尝试将标签的maxPreferredLayoutWidth重置为内容视图的宽度,但是它没有似乎影响任何事情。
我已将每个视图上的translationsAutoresizingMaskIntoConstraints设置为NO,但没有效果。我已经将两个标签的拥抱/抗压优先级都设置了,并且它的scrollview设置为1000,但是没有运气。将它们设置在容器视图上也不起作用。
这是我的IB视图设置的屏幕截图:


我的猜测在某种程度上与Popover托管视图及其自动布局约束有关,但我不确定。
我通过简单的方式更新标签
_textContainerHeaderLabel.text = headerText;
_textContainerBodyTextLabel.text = bodyText;
[self.view setNeedsUpdateConstraints];
[self.view layoutSubviews];
Run Code Online (Sandbox Code Playgroud)
因此,主要问题-当视图具有UIScrollViews时,如何通过自动布局计算视图的最佳拟合大小?