动态调整弹出窗口大小以适应其contentViewController。

3
我有一个弹出控制器,我在代码中实例化并将其内容视图控制器传递给它,一切都很好。问题是后来当内容视图控制器可能因消息标签显示任意长的字符串而调整大小时。
我要提到的UILabel是... “验证和错误消息框”
我想以某种方式配置布局约束,以便当用户在文本框中输入值,然后点击接受按钮时,如果我有任何要向他们呈现的验证错误,我可以通过将它们添加到标签中(我已经设置为需要多行数据),并且当添加时,如果它们需要5行显示,那么标签将推下UITextField和Accept/Cancel按钮,以便能够显示所有标签内容。好吧,我已经能够做到这一点,并且contentViewController按预期调整大小。问题是,包含它的popover控制器不会调整大小,因此发生的情况是,我的Accept/Cancel按钮被推到了弹出窗体的底部边缘,因此用户无法访问它们。
是否有任何约束可设置,以强制弹出控制器的高度扩大,以便当有多行验证文本时,“验证和错误消息框”下面的UI控件不会被推到底部边缘?
我在代码中创建popoverController,因此我假设我需要在代码中进行约束。

你可能需要通过自动布局的内在调整教程进行学习。此外,还有一些关于自动布局的基础教程。这只是配置适当约束条件的简单问题。非常基础的内容。 - TheCodingArt
1
既然我正在将这个预先构建/预设大小的contentViewController传递给一个弹出窗口,它在创建时确定其大小,我猜测即使contentViewController被重新调整大小,弹出窗口控制器也不会在创建后动态调整大小。我认为这不像你所声称的那么基础。 - Logicsaurus Rex
Subviews是朋友... - TheCodingArt
此外,如果您不喜欢当前的弹出窗口限制,通过使用childviewcontrollers自己创建非常容易。 - TheCodingArt
1
我认为你需要将contentViewController设置为所需高度的最大值,但是给它一个清晰的背景颜色,并将灰色视图作为其子视图显示--该子视图应能够随标签而增长。 - rdelmar
3个回答

7
这里是我的解决方案,不需要使用约束条件。所有我能找到的关于使用AutoLayout和约束条件的资料都没有有用的解决方案。
在创建弹出窗口并显示之前,我使用以下代码…
CGSize newSize = [theContentViewController.view systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
CGRect newFrame = CGRectMake(0, 0, newSize.width, newSize.height);
[theContentViewController.view setFrame:newFrame];

[thePopover setPopoverContentSize:theContentViewController.view.frame.size animated:YES];

然后,在用户按下接受按钮之后,在contentViewController内部,我会评估他们的输入是否可接受,并使用任何消息更新标签,然后调用上述相同的代码,它将动画到新的大小以适应大型消息或其他内容。


1

2018年的答案:将此放入ContentViewController中

override func viewDidLoad() {
    super.viewDidLoad()
    preferredContentSize = view.frame.size
}

这几乎不可能奏效:它假定您在self.view中具有绝对静态的布局。 - xaphod

0

假设我们已经使用自动布局来完全约束我们的内容,我们可以计算出适合的大小并使用它来调整气泡窗口的大小。在我的内容视图控制器的viewDidLoad方法中:

preferredContentSize = view.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)

在视图控制器的根视图上使用systemLayoutSizeFitting会要求自动布局引擎计算最小的(layoutFittingCompressedSize)适合布局的大小:

Ref: https://useyourloaf.com/blog/self-sizing-popovers


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