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