Swift自動布局庫SnapKit的約束優先順序,約束做動畫使用詳解

來源:互聯網
上載者:User

1,約束優先順序

我們使用SnapKit的時候,還可以定義約束的優先順序。這樣當約束出現衝突的時候,優先順序高的約束覆蓋優先順序低的約束。具體優先順序可以放在約束鏈的結束處。

(1)可以設定如下幾種優先順序

priorityLow():設定低優先順序,優先順序為250
priorityMedium():設定中優先順序,優先順序為500(這個也就是預設的優先順序)
priorityHigh():設定高優先順序,優先順序為750
priority():可以設定任意的優先順序,接受的參數是0-1000的數字。比如:priority(600)

(2)使用優先順序的範例

下面我們在螢幕中央放置一個100*100的橙色方塊,給其定義了長寬尺寸小於等於螢幕的大小的預設優先順序約束。同時,每次點擊螢幕的時候,會更新放大它的尺寸。但由於這個約束的優先順序是低,所有方塊頂到螢幕邊緣後就會不再放大。


import UIKit
import SnapKit
 
class ViewController: UIViewController {
    
    lazy var box = UIView()
    
    var scacle = 1.0
   
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //單擊監聽
        let tapSingle=UITapGestureRecognizer(target:self,action:#selector(tapSingleDid))
        tapSingle.numberOfTapsRequired=1
        tapSingle.numberOfTouchesRequired=1
        self.view.addGestureRecognizer(tapSingle)
        
        box.backgroundColor = UIColor.orangeColor()
        self.view.addSubview(box)
        
        box.snp_makeConstraints { (make) -> Void in
            //視圖置中
            make.center.equalTo(self.view)
            //初始寬、高為100(優先順序低)
            make.width.height.equalTo(100 * self.scacle).priorityLow();
            //最大尺寸不能超過螢幕
            make.width.height.lessThanOrEqualTo(self.view.snp_width)
            make.width.height.lessThanOrEqualTo(self.view.snp_height)
        }
    }
    
    //點擊螢幕
    func tapSingleDid(){
        self.scacle += 0.5
        self.box.snp_updateConstraints{ (make) -> Void in
            //放大視圖(優先順序最低)
            make.width.height.equalTo(100 * self.scacle).priorityLow();
        }
    }
}

2,帶有動畫效果

配合 UIView.animateWithDuration,我們可以在約束改變的時候有動畫效果。
還是以上面的範例示範,不夠這次點擊螢幕時橙色視圖放大的時候會有過渡,而不是一下就變大。


import UIKit
import SnapKit
 
class ViewController: UIViewController {
    
    lazy var box = UIView()
    
    var scacle = 1.0
   
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //單擊監聽
        let tapSingle=UITapGestureRecognizer(target:self,action:#selector(tapSingleDid))
        tapSingle.numberOfTapsRequired=1
        tapSingle.numberOfTouchesRequired=1
        self.view.addGestureRecognizer(tapSingle)
        
        box.backgroundColor = UIColor.orangeColor()
        self.view.addSubview(box)
        
        box.snp_makeConstraints { (make) -> Void in
            //視圖置中
            make.center.equalTo(self.view)
            //初始寬、高為100(優先順序低)
            make.width.height.equalTo(100 * self.scacle).priorityLow();
            //最大尺寸不能超過螢幕
            make.width.height.lessThanOrEqualTo(self.view.snp_width)
            make.width.height.lessThanOrEqualTo(self.view.snp_height)
        }
    }
    
    //視圖約束更新
    override func updateViewConstraints() {
        self.box.snp_updateConstraints{ (make) -> Void in
            //放大尺寸(優先順序低)
            make.width.height.equalTo(100 * self.scacle).priorityLow();
        }
        
        super.updateViewConstraints()
    }
    
    //點擊螢幕
    func tapSingleDid(){
        self.scacle += 0.5
        //告訴self.view約束需要更新
        self.view.setNeedsUpdateConstraints()
        //動畫
        UIView.animateWithDuration(0.3) {
            self.view.layoutIfNeeded()
        }
    }
}

原文出自:www.hangge.com 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.