Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画)
作者:hangge | 2016-04-03 10:10
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()
}
}
}
全部评论(1)
约束等级不一致就会报错 这是为啥
站长回复:我测试了下文章代码是没问题的啊。如果是你自己写的代码的话,要注意下约束等级,如果优先级设置不对就会造成无法生成正确的约束,从而报错。