在之前的文章中我介紹了如何使用SnapKit的 snp_makeConstraints 方法進行各種約束的設置。但有時我們的頁面並不是一直固定不變的,這就需要修改已經存在的約束。本文介紹如何更新、移除、代替現有的約束。
1,刪除約束
要實現對現有的約束進行更新或者移除,我們需要先將約束的結果賦值給一個局部變量或一個類屬性,然後對這個約束的引用進行操作。
比如下面樣例:開始時我們給橙色方塊添加了個距屏幕上方40像素的約束,點擊按鈕後使用 uninstall() 方法把這個約束給移除。
import UIKit
import SnapKit
class ViewController: UIViewController {
lazy var box = UIView()
//保存約束的引用
var topConstraint:Constraint?
override func viewDidLoad() {
super.viewDidLoad()
box.backgroundColor = UIColor.orangeColor()
self.view.addSubview(box)
box.snp_makeConstraints { (make) -> Void in
make.width.height.equalTo(150)
make.centerX.equalTo(self.view)
self.topConstraint = make.top.equalTo(self.view).offset(40).constraint
}
}
//按鈕點擊
@IBAction func btnTouch(sender: AnyObject) {
//移除約束
self.topConstraint?.uninstall()
}
}
2,通過約束的引用來更新約束
還是以上面距屏幕上方40像素的約束為例,點擊按鈕後,通過調用約束引用的 updateOffset() 方法把距離修改成60像素。
import UIKit
import SnapKit
class ViewController: UIViewController {
lazy var box = UIView()
//保存約束的引用
var topConstraint:Constraint?
override func viewDidLoad() {
super.viewDidLoad()
box.backgroundColor = UIColor.orangeColor()
self.view.addSubview(box)
box.snp_makeConstraints { (make) -> Void in
make.width.height.equalTo(150)
make.centerX.equalTo(self.view)
self.topConstraint = make.top.equalTo(self.view).offset(40).constraint
}
}
//按鈕點擊
@IBAction func btnTouch(sender: AnyObject) {
//更新修改約束
self.topConstraint?.updateOffset(60)
}
}
3,使用snp_updateConstraints更新約束
我們還可以用 snp_updateConstraints 方法來代替 snp_makeConstraints 進行約束的更新,這個更新操作通常放在 UIViewController 的 updateViewConstraints() 方法中,或者 UIView 的 updateConstraints() 方法中執行,這樣視圖約束需要更新的時候會自動調用。
比如下面樣例,我們使用 snp_updateConstraints() 方法設置橙色視圖的寬度約束為與屏幕等寬,這樣不管設備如何旋轉,視圖都回自動更新約束撐滿屏幕。
import UIKit
import SnapKit
class ViewController: UIViewController {
lazy var box = UIView()
override func viewDidLoad() {
super.viewDidLoad()
box.backgroundColor = UIColor.orangeColor()
self.view.addSubview(box)
box.snp_makeConstraints { (make) -> Void in
make.height.equalTo(150)
make.centerX.equalTo(self.view)
}
}
//視圖約束更新
override func updateViewConstraints() {
self.box.snp_updateConstraints{ (make) -> Void in
//視圖寬度與屏幕等寬
make.width.equalTo(self.view)
}
super.updateViewConstraints()
}
}
4,使用snp_remakeConstraints重做約束
snp_remakeConstraints 與 snp_makeConstraints 用法類似,不同的是 snp_remakeConstraints 首先會先清除掉之前所有被SnapKit設置的約束。
下面樣例:初始化時橙色視圖約束是寬高150,水平居中。點擊按鈕後重做約束,寬高變100,且不再居中。
import UIKit
import SnapKit
class ViewController: UIViewController {
lazy var box = UIView()
override func viewDidLoad() {
super.viewDidLoad()
box.backgroundColor = UIColor.orangeColor()
self.view.addSubview(box)
box.snp_makeConstraints { (make) -> Void in
make.width.height.equalTo(150)
make.centerX.equalTo(self.view)
}
}
//按鈕點擊
@IBAction func btnTouch(sender: AnyObject) {
//重做約束
box.snp_remakeConstraints { (make) -> Void in
make.width.height.equalTo(100)
}
}
}