如何通过故事板中的组件使容器视图自行调整大小

Tom*_*you 17 ios swift

UIViewController在我的故事板中添加了一个容器视图,该视图由单独的UIViewController. 这个容器视图需要有一个与之关联的高度,以便正确地布置项目。然而,这个容器视图的高度是动态的,因为它包含一个UITextView项目。之前,当我不使用容器视图时,自动布局会为我计算项目的高度。现在我已将所有内容移至容器视图,这似乎是不可能的。我是否必须手动计算容器视图的高度并将其应用于约束,或者有没有办法让自动布局处理它?

Don*_*Mag 29

你可以这样做,但你需要一点代码。

当 aUIViewController嵌入到容器视图中时,其“根视图”将其.translatesAutoresizingMaskIntoConstraints设置为 true,并且其框架会自动设置为容器视图的边界。

如果您的嵌入式 VC 将约束设置为正确调整自身大小,您可以.translatesAutoresizingMaskIntoConstraints在加载时禁用其根视图。

例如,假设我们有这样的布局,并且“内容 VC”中的标签将具有可变数量的行:

在此处输入图片说明

我们希望容器视图自动更改其高度,以便所有文本都适合。但是,如果我们添加 10 行文本,“默认”结果将是:

在此处输入图片说明

所以,我们给容器视图 Top/Leading/Trailing 约束8(所以我们在侧面有一点填充),以及一个高度约束128......但我们将高度约束的更改Priority250 (Low)。这满足 IB,但在运行时为我们提供了高度的灵活性。

在我们的“内容 VC”中,我们添加了一个标签并将它的顶部/前导/尾随/底部全部限制为8(再次,仅用于一些填充),当然,行数设置为0

现在,在我们的主 VC 中,我们在嵌入式 VC 的根视图上实现prepare(for segue...)和禁用.translatesAutoresizingMaskIntoConstraints

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    if let childViewController = segue.destination as? MyContentViewController {
        childViewController.view.translatesAutoresizingMaskIntoConstraints = false
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在运行时,我们标签的固有高度将增加其超视图(根视图)的高度,这将覆盖容器视图的低优先级高度常量,导致:

在此处输入图片说明

这是两个 VC 的完整代码:

import UIKit

class MyContentViewController: UIViewController {

    @IBOutlet var theLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // add 10 lines of text to the label
        theLabel.text = (1...10).map({ "Line \($0)" }).joined(separator: "\n")

    }

}

class ContainerContentViewController: UIViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        if let childViewController = segue.destination as? MyContentViewController {
            childViewController.view.translatesAutoresizingMaskIntoConstraints = false
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 超级好,但是,请注意,将其简单地设置在子 VC 中要容易得多! (2认同)