heightAnchor.constraint 不改变视角高度

heightAnchor.constraint not change height of view

我使用这个代码:

func show(){
    view.translatesAutoresizingMaskIntoConstraints = false
    view.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    view.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
    view.heightAnchor.constraint(equalToConstant: view.frame.height - 300).isActive = true
    view.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
}

func hide(){
    view.translatesAutoresizingMaskIntoConstraints = false
    view.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    view.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
    view.heightAnchor.constraint(equalToConstant: view.frame.height + 300).isActive = true
    view.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
}

show功能正常,但hide功能不工作,heightAnchor不工作。

我建议你在不同的函数中设置你的约束,比如 setup() 并将它们存储在一些变量中,你可以在之后修改,我会给你看一个例子

var constraint: NSLayoutConstraint?

func setup() {
    constraint = view.heightAnchor.constraint(equalToConstant: view.frame.height)
}

func show() {
    if constraint != nil {
        constraint!.constant = constraint!.constant + 300
    }
}

func hide() {
    if constraint != nil {
        constraint!.constant = constraint!.constant - 300
    }
}

首先声明约束

var heightArchonWhenShow = view.heightAnchor.constraint(equalToConstant: view.frame.height - 300)
var heightArchonWhenHide = view.heightAnchor.constraint(equalToConstant: view.frame.height + 300)

初始化您对 ViewDidLoad 的约束后

func setConstraints(){
    view.translatesAutoresizingMaskIntoConstraints = false
    view.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    view.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
    view.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
    heightArchonWhenShow.isActive = true
}

并简单激活它们,不要覆盖。像这样:

func show(){
    heightArchonWhenShow.isActive = true
    heightArchonWhenHide.isActive = false
}

func hide(){
    heightArchonWhenShow.isActive = false
    heightArchonWhenHide.isActive = true
}

如果你愿意,你也可以为变化设置动画,就像这样:

func hide(){
    heightArchonWhenShow.isActive = false
    heightArchonWhenHide.isActive = true

    UIView.animate(withDuration: 0.3) {
        self.view.layoutIfNeeded()
    }
}

您只需要 1 个变量

var heightCon = view.heightAnchor.constraint(equalToConstant: view.frame.height - 300)
heightCon.isActive = true

然后管理它的常量值

func showOrHide(_ te:Bool){

   heightCon.constant = te ? view.frame.height - 300 : view.frame.height + 300

     UIView.animate(withDuration: 0.3) {
        self.view.layoutIfNeeded()
    }
}