ios 使用约束隐藏视图

ios using constraints to hide a view

为什么如果我有一个带有按钮的简单 viewcontroller,下方有一个 "control view" 和一个 table 视图,我无法使逻辑正常工作将在按下按钮时展开 table 视图以覆盖 "view",然后在再次按下时恢复。 table 将覆盖 "control view" 但是当第二次按下时, "restore" table 不会位于 "control view"

下方
@IBAction func buttonPressed(_ sender: Any) {

        if bControlHide == false {
            myTableView.translatesAutoresizingMaskIntoConstraints = false
            myControlView.translatesAutoresizingMaskIntoConstraints = false
            myTableView.topAnchor.constraint(
                equalTo: myControlView.topAnchor).isActive = true
            bControlHide = true
        }
        else {
            bControlHide = false
            myTableView.translatesAutoresizingMaskIntoConstraints = false
            myControlView.translatesAutoresizingMaskIntoConstraints = false
            myTableView.topAnchor.constraint(
                equalTo: myControlView.bottomAnchor).isActive = true
        }
    }

您应该设置 tableview 的高度,并且 tableview 应该限制为顶部和底部的垂直间距(如果您想支持不同的设备)。

初始设置为:

  • 高度常量大于0
  • 高度优先级为1000
  • 底部约束为 0
  • 底部优先级为 750

当您点击按钮时,您只需更改优先级:

  • 身高优先级为750
  • 底部优先级为 1000

如果你的controlView有固定高度,

1) 为storyboard的controlView高度做一个outlet到ViewController,需要隐藏的时候设置为0。取消隐藏时设置另一个值。

别忘了把0controlView底部space设为tableView,否则tableView不会覆盖你的controlView.

请关注以下代码:

myTableView.topAnchor.constraint(equalTo:myControlView.topAnchor).isActive = true
myTableView.topAnchor.constraint(equalTo: myControlView.bottomAnchor).isActive = true

每次调用myTableView.topAnchor.constraint都会添加一个新的约束,这不是你想要的。

所以请创建并保存这两个约束到成员变量中,然后根据需要激活或取消激活。

顺便说一句,您不必每次单击按钮时都设置 translatesAutoresizingMaskIntoConstraints,在 xib 或 viewDidLoad 中设置一次即可