Search code examples
swiftconstraintsios-autolayoutautoresizenslayoutanchor

heightAnchor.constraint not change height of view


I use this code:

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 function works fine, but hide function does not work and heightAnchor does not work.


Solution

  • First declare constraints

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

    After init your constraints on 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
    }
    

    And simple active them , don't overwrite. Like this:

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

    If u want u can also animate changes, like that :

    func hide(){
        heightArchonWhenShow.isActive = false
        heightArchonWhenHide.isActive = true
    
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
    }