答案 0 :(得分:1)
在iOS上,UI模型通常是父视图控制子视图大小。例如,每个视图都有initWithFrame
构造函数,创建视图的人(通常是父创建子视图)应该传递大小。这被称为"基于帧的布局"。这个系统是从上到下的#34;。
但是,Auto Layout可以让你"粘合"父母和子女一起观看,并指定那些"胶水"约束到父视图的大小和定位约束。如果"胶水" (以及孩子的抗压力)胜过父母的约束,父母将根据孩子的大小调整大小。
使用自动布局约束可以直接使用2个自定义视图(父级和子级),但问题是您的父级和子级之间看起来中间有UINavigationController
。我不推荐这种布局的一个原因是导航栏通常应位于应用屏幕的顶部,并且在导航时不应该上下跳跃。另一个原因是由UINavigationController
来决定它限制儿童观点的方式,并试图改变其习惯不是我推荐的。
您可能尝试的一件事是实现navigationController:willShowViewController:animated:委托方法并尝试从那里手动调整UINavigationController
的高度,具体取决于推送的子视图控制器。
答案 1 :(得分:1)
在内容视图控制器中,按如下所示设置preferredContentSize
override func viewDidLoad() {
super.viewDidLoad()
preferredContentSize = CGSize(width: 400, height: 200)
}
当孩子被添加到parentViewController时,parentViewController会收到有关首选大小的通知。在父级
上调用以下函数
func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer)
通过这种方法,您可以将容器更改为孩子喜欢的尺寸。
例如,将高度更改为孩子/内容的首选高度
override func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer) {
// heightConstraint is a IBOutlet to your NSLayoutConstraint you want to adapt to height of your content
heigtConstraint.constant = container.preferredContentSize.height
}
也许您必须将其传递给NavigationViewController。在我的示例中,父级和内容之间没有NavigationViewController。