隐藏互斥子视图后,调整容器UIView的大小以匹配可见子视图的高度

Cra*_*lot 1 storyboard xib ios autolayout nslayoutconstraint

ParentView包含ChildView1和ChildView2。这些子视图的高度不同。

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

两个子视图都“驱动” ParentView的高度,也就是说,AutoLayout约束已连线,使得ParentView与ChildView1或ChildView2一样高,而没有更高。

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

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

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

rob*_*off 5

隐藏的视图仍参与布局。除了隐藏视图之外,还需要取消激活隐藏视图上的约束。

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

更新

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

创建门店集合

集合最终连接到情节提要中的多个对象:

查看控制器连接

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

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)
    }

}
Run Code Online (Sandbox Code Playgroud)