heightAnchor.constraint不会更改视图高度

时间:2018-12-12 09:24:34

标签: swift constraints ios-autolayout autoresize nslayoutanchor

我使用以下代码:

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不起作用。

3 个答案:

答案 0 :(得分:4)

首先声明约束

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 :(得分:1)

您只需要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()
    }
}

答案 2 :(得分:0)

我建议您将约束设置为其他函数,例如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
    }
}