Swift - 自動布局庫SnapKit的使用詳解3(約束優先級,約束做動畫)


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()
        }
    }
}


免責聲明!

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



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