【问题标题】:Autoresize UIPopoverController using autolayout使用自动布局自动调整 UIPopoverController 的大小
【发布时间】:2014-05-22 18:46:03
【问题描述】:

我正在尝试使用自动布局来自动调整弹出框的大小以适应其内容。我已经固定了弹出框宽度,但要计算高度,我依赖 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 方法。

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

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

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

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

我正在通过简单的方式更新我的标签

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


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

那么,主要问题 - 当它有 UIScrollViews 时,我如何通过自动布局计算视图的最佳拟合尺寸?

【问题讨论】:

    标签: ios objective-c uiscrollview autolayout uipopovercontroller


    【解决方案1】:

    终于找到了这个案例的解决方案。不知道它有多正确,但我做了以下事情 - 我从标签添加了高度不等式约束(> = 0)到它的滚动视图。 诀窍是使这个约束的优先级低于标签的抗压性(在我的例子中是垂直的)。这似乎解决了这个问题。

    【讨论】: