我正在尝试使用自动布局来自动调整我的弹出窗口大小以适应其内容。我有一个固定的弹出窗口宽度,但为了计算高度,我依赖于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
并返回适合视图所有内容的有效大小。
当我尝试将我的正文标签放在UIScrollView中时(无论是在IB中还是在代码中),问题就出现了。
从现在开始,systemLayoutSizeFittingSize
不会考虑正文标签高度,并将返回标头+图像的高度。 我已经在IB中设置了所有约束以支持Pure Autolayout方法。
我已检查scrollview的内容大小-它确实等于正文标签的固有大小,但滚动视图的框架被挤压为0。
我已经检查并尝试重置标签的maxPreferredLayoutWidth到内容视图的宽度,但似乎没有影响任何事情。
我已经将每个视图上的translatesAutoresizingMaskIntoConstraints设置为NO,但没有效果。 我已经将标签及其滚动视图的拉扯/压缩阻力优先级设置为1000,但没有运气。 容器视图上设置它们也不起作用。
以下是我的IB视图设置的屏幕截图:
我猜这与弹出窗口托管视图及其自动布局约束有关,但不确定。
我通过简单地更新标签进行更新
_textContainerHeaderLabel.text = headerText;
_textContainerBodyTextLabel.text = bodyText;
[self.view setNeedsUpdateConstraints];
[self.view layoutSubviews];
所以,主要问题是:当视图中有 UIScrollViews 时,如何通过自动布局计算视图的最佳适合大小?