Autolayout - Changing Constraint

在iOS中进行布局,现在基本上是使用Autolayout,所以不免有时候需要对约束进行修改,比如:修改约束,或者为视图添加动画. 对于改变约束其实就是修改潜在的约束公式,如下:




那么有哪些行为会改变约束呢?

1) 生效和失效约束(Activating or deactivating a constraint)

2)改变约束的常量值(Changing the constraint's constant value)

3)改变约束的优先级(Changing the constraint's priority)

4)从view的层级中去除view(Removing a view from the view hierarchy)

当然对于一些其它的改变,像:修改控件的属性或者修改视图的层级这些操作也会改变约束。当改变发生之后,系统调度者(system schedules)会延迟布局的传递,再更新约束布局并重新计算视图的frame。


改变约束(Change constraint)

开发中经常会碰到需要修改已有的约束的操作,比如:刚开始是一个水平、垂直居中的view,有着固定的大小,这时候为想宽度变为距离屏幕为10,那么就需要对原有的约束进行修改。具体操作如下,相关详情看这里,对于IB部分的约束要注意,需要去除weak,不然deactivate之后约束就不存在了,具体描述

class ViewController: UIViewController {
    
    @IBOutlet weak var redView: UIView!
    @IBOutlet var widthConstraint: NSLayoutConstraint!
    @IBOutlet weak var heightConstraint: NSLayoutConstraint!
    @IBOutlet var centerXConstraint: NSLayoutConstraint!
    var leadingConstraint: NSLayoutConstraint!
    var trailingConstraint: NSLayoutConstraint!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func tappedSwitch(_ sender: Any) {
        if let sw = sender as? UISwitch {
            if sw.isOn {
                // 1、失效原有的约束
                NSLayoutConstraint.deactivate([centerXConstraint, widthConstraint])
                // 2、添加新的约束
                leadingConstraint = NSLayoutConstraint(item: redView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 10)
                trailingConstraint = NSLayoutConstraint(item: redView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: -10)
                // 3、生效新的约束
                NSLayoutConstraint.activate([leadingConstraint, trailingConstraint])
            } else {
                NSLayoutConstraint.deactivate([leadingConstraint, trailingConstraint])
                NSLayoutConstraint.activate([widthConstraint, heightConstraint, centerXConstraint])
            }
            UIView.animate(withDuration: 0.5) {
                self.view.layoutIfNeeded()
            }
        }
    }
}

效果如下:


动画约束(Animation Constraint)

看一个简单的例子:在ViewController上添加一个UIView和一个UISwitch,通过控制点击UISwitch以动画的方式改变UIView的大小,以前在手动布局的时候是在UIView的animation动画闭包中改变frame,现在以约束布局同样简单,1)改变约束 2)调用父视图的layoutIfNeeded重新布局并执行动画。更多相关和详情

class ViewController: UIViewController {
    @IBOutlet weak var redView: UIView!
    @IBOutlet weak var widthConstraint: NSLayoutConstraint!
    @IBOutlet weak var heightConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func tappedSwitch(_ sender: Any) {
        if let sw = sender as? UISwitch {
            if sw.isOn {
                widthConstraint.constant = 300
                heightConstraint.constant = 300
            } else {
                widthConstraint.constant = 100
                heightConstraint.constant = 100
            }
            UIView.animate(withDuration: 0.5) {
                self.view.layoutIfNeeded() 
            }
        }
    }
}

效果如下:



参考:

Changing Constraints



猜你喜欢

转载自blog.csdn.net/longshihua/article/details/80094401