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 集合连接到多个对象。演示:
这些集合最终连接到 Storyboard中的多个对象:
然后,您可以使用一个语句激活或停用一组约束:
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)
}
}