Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画)
SnapKit文章系列:(代码均已升级至Swift3)
Swift - 自动布局库SnapKit的使用详解1(配置、使用方法、样例)
Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做)
Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画) --- 当前文章
Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)
Swift - 自动布局库SnapKit的使用详解5(样例2:实现一个计算器界面)
Swift - 自动布局库SnapKit的使用详解1(配置、使用方法、样例)
Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做)
Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画) --- 当前文章
Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)
Swift - 自动布局库SnapKit的使用详解5(样例2:实现一个计算器界面)
1,约束优先级
我们使用SnapKit的时候,还可以定义约束的优先级。这样当约束出现冲突的时候,优先级高的约束覆盖优先级低的约束。具体优先级可以放在约束链的结束处。
(1)优先级设置
- 通过 priority() 方法我们可以设置任意的优先级,接受的参数是0-1000的数字。比如:priority(600)。
- 如果不设置的话,默认的优先级是1000。
(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.orange self.view.addSubview(box) box.snp.makeConstraints { (make) -> Void in //视图居中 make.center.equalTo(self.view) //初始宽、高为100(优先级低) make.width.height.equalTo(100 * self.scacle).priority(250) //最大尺寸不能超过屏幕 make.width.height.lessThanOrEqualTo(self.view.snp.width) make.width.height.lessThanOrEqualTo(self.view.snp.height) } } //点击屏幕 @objc func tapSingleDid(){ self.scacle += 0.5 self.box.snp.updateConstraints{ (make) -> Void in //放大视图(优先级最低) make.width.height.equalTo(100 * self.scacle).priority(250) } } }
配合 UIView.animate(withDuration: ),我们可以在约束改变的时候有动画效果。
还是以上面的样例演示,不够这次点击屏幕时橙色视图放大的时候会有过渡,而不是一下就变大。

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.orange self.view.addSubview(box) box.snp.makeConstraints { (make) -> Void in //视图居中 make.center.equalTo(self.view) //初始宽、高为100(优先级低) make.width.height.equalTo(100 * self.scacle).priority(250) //最大尺寸不能超过屏幕 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).priority(250) } super.updateViewConstraints() } //点击屏幕 @objc func tapSingleDid(){ self.scacle += 0.5 //告诉self.view约束需要更新 self.view.setNeedsUpdateConstraints() //动画 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } }
约束等级不一致就会报错 这是为啥