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