Swift自動布局庫SnapKit的約束的更新、移除、重做例子

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.