ParentView 包含 ChildView1 和 ChildView2。这些 subview 具有不同的高度。

ChildView1 比 ChildView2 高。仅显示一个 subview ,例如,如果 ChildView1 可见,则 ChildView2 隐藏。 ChildView1 和 ChildView2 都使用自定义 XIB。

两个 subview 都“驱动”了 ParentView 的高度,即 AutoLayout 约束被连接,使得 ParentView 与 ChildView1 或 ChildView2 一样高,并且不会更高。

问题是隐藏 ChildView1 并显示 ChildView2 不会“缩小”ParentView 以匹配 ChildView2 的高度。它保持在较高的 subview ChildView1 的高度。

调用 sizeToFit()setNeedsLayout() 不会改变事情。

隐藏 ChildView1 时,如何强制 ParentView 匹配 ChildView2 的高度?

最佳答案

隐藏 View 仍然参与布局。除了隐藏它之外,您还需要停用对隐藏 View 的约束。

如果您的部署目标是 iOS 9 或更高版本,您可以将父级设置为 UIStackView 。在布局期间,堆栈 View 会自动忽略其隐藏的子项。

更新

您不需要为所有约束设置单独的 socket 。您只需要两个 socket 系列。您可以将一个 socket 集合连接到多个对象。演示:

ios - 隐藏互斥 subview 后,调整容器 UIView 的大小以匹配可见 subview 的高度-LMLPHP

这些集合最终连接到 Storyboard中的多个对象:

ios - 隐藏互斥 subview 后,调整容器 UIView 的大小以匹配可见 subview 的高度-LMLPHP

然后,您可以使用一个语句激活或停用一组约束:

class ViewController: UIViewController {

    @IBOutlet var pinkConstraints: [NSLayoutConstraint]!
    @IBOutlet var greenConstraints: [NSLayoutConstraint]!

    func showPink() {
        NSLayoutConstraint.deactivateConstraints(greenConstraints)
        NSLayoutConstraint.activateConstraints(pinkConstraints)
    }

    func showGreen() {
        NSLayoutConstraint.deactivateConstraints(pinkConstraints)
        NSLayoutConstraint.activateConstraints(greenConstraints)
    }

}

10-08 05:45