Swift - 自動布局庫SnapKit的使用詳解2(約束的更新、移除、重做)


在之前的文章中我介紹了如何使用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)
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM