【问题标题】:heightAnchor.constraint not change height of viewheightAnchor.constraint 不改变视图高度
【发布时间】:2019-05-13 08:48:21
【问题描述】:

我使用这个代码:

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 不工作。

【问题讨论】:

  • 在使用hide函数之前是否删除所有约束?
  • 我使用此代码进行删除:view.translatesAutoresizingMaskIntoConstraints = false
  • 不,该代码不会删除您以前的设置约束。它只是关闭自动布局引擎
  • 使用这个view.removeConstraints(constraints: [NSLayoutConstraint][NSLayoutConstraint]) 删除所有你想要的约束

标签: swift constraints ios-autolayout autoresize nslayoutanchor


【解决方案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】:

    我建议你在不同的函数中设置你的约束,比如 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
        }
    }
    

    【讨论】:

    • 这甚至不会编译 >:(
    • 我做了一些编辑,在抱歉之前我犯了一些错误 :) 但我看到了另一个答案,它更好更详细:D
    【解决方案3】:

    首先声明约束

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

    【讨论】:

    • 最佳答案,非常感谢。
    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多