【问题标题】:How to Change height of Container view (Parent view) according to Childviewcontroller (Different size of UIViewController) height?如何根据 Childviewcontroller(UIViewController 的不同大小)高度更改容器视图(父视图)的高度?
【发布时间】:2018-10-26 16:43:36
【问题描述】:

想根据推送的 UIViewController 更改容器视图的高度。目前我不知道应该如何更新容器视图的高度。

【问题讨论】:

  • 为什么不直接使用带有乘数和/或常数参数的高度锚?还是我错过了什么?
  • 我想要一些东西,我的容器视图会自动使用其 childviewcontroller 的高度(不同大小的 viewcontrollers)。或者想触发从 childviewcontroller 到 Green viewcontroller 的东西,这样我就可以改变容器视图的高度常数。

标签: ios objective-c iphone swift autolayout


【解决方案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。

【讨论】:

    【解决方案2】:

    在 iOS 上,UI 模型通常是这样的,即父视图控制子视图的大小。例如,每个视图都有initWithFrame 构造函数,并且创建视图的人(通常是父创建子)应该传入大小。这被称为“基于框架的布局”。这个系统有点“从上到下”。

    但是,Auto Layout 允许您将父视图和子视图“粘合”在一起,并指定这些“粘合”约束与父视图的大小和定位约束的相对优先级。如果“胶水”(和子级的抗压性)克服了父级的约束,父级将根据子级的大小调整大小。

    为此使用自动布局约束很简单,有 2 个自定义视图(父视图和子视图),但问题是看起来您的父子视图中间有一个 UINavigationController。我在这里不推荐这种布局的一个原因是导航栏通常应该位于应用程序屏幕的顶部,并且导航时它不应该上下跳跃。另一个原因是由UINavigationController 来决定它限制子视图的方式,我不建议尝试改变它的习惯。

    您可能会尝试的一件事是实现navigationController:willShowViewController:animated: 委托方法并尝试根据推送的子视图控制器从那里手动调整UINavigationController 的高度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      相关资源
      最近更新 更多