Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做)
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,删除约束
要实现对现有的约束进行更新或者移除,我们需要先将约束的结果赋值给一个局部变量或一个类属性,然后对这个约束的引用进行操作。比如下面样例:开始时我们给橙色方块添加宽高150约束,以及页面居中约束,点击按钮后使用 deactivate() 方法把这尺寸约束给移除,方块消失(长宽变成0,0)


import UIKit import SnapKit class ViewController: UIViewController { lazy var box = UIView() //保存约束的引用 var sizeConstraint:Constraint? override func viewDidLoad() { super.viewDidLoad() box.backgroundColor = UIColor.orange self.view.addSubview(box) box.snp.makeConstraints { (make) -> Void in self.sizeConstraint = make.width.height.equalTo(150).constraint make.center.equalTo(self.view) } } //按钮点击 @IBAction func btnTouch(_ sender: AnyObject) { //移除约束 self.sizeConstraint?.deactivate() } }
2,通过约束的引用来更新约束
还是以上面距屏幕上方40像素的约束为例,点击按钮后,通过调用约束引用的 update(offset:) 方法把距离修改成60像素。


import UIKit import SnapKit class ViewController: UIViewController { lazy var box = UIView() //保存约束的引用 var topConstraint:Constraint? override func viewDidLoad() { super.viewDidLoad() box.backgroundColor = UIColor.orange self.view.addSubview(box) box.snp.makeConstraints { (make) -> Void in make.width.height.equalTo(150) make.centerX.equalTo(self.view) self.topConstraint = make.top.equalTo(self.view).offset(40).constraint } } //按钮点击 @IBAction func btnTouch(_ sender: AnyObject) { //更新修改约束 self.topConstraint?.update(offset: 60) } }
3,使用snp.updateConstraints更新约束
我们还可以用 snp.updateConstraints 方法来代替 snp.makeConstraints 进行约束的更新,这个更新操作通常放在 UIViewController 的 updateViewConstraints() 方法中,或者 UIView 的 updateConstraints() 方法中执行,这样视图约束需要更新的时候会自动调用。
比如下面样例,我们使用 snp.updateConstraints() 方法设置橙色视图的宽度约束为与屏幕等宽,这样不管设备如何旋转,视图都回自动更新约束撑满屏幕。


import UIKit import SnapKit class ViewController: UIViewController { lazy var box = UIView() override func viewDidLoad() { super.viewDidLoad() box.backgroundColor = UIColor.orange self.view.addSubview(box) box.snp.makeConstraints { (make) -> Void in make.width.equalTo(self.view) make.height.equalTo(150) make.centerX.equalTo(self.view) } } //视图约束更新 override func updateViewConstraints() { self.box.snp.updateConstraints{ (make) -> Void in //视图宽度与屏幕等宽 make.width.equalTo(self.view) } super.updateViewConstraints() } }
4,使用snp.remakeConstraints重做约束
snp.remakeConstraints 与 snp.makeConstraints 用法类似,不同的是 snp.remakeConstraints 首先会先清除掉之前所有被SnapKit设置的约束。
下面样例:初始化时橙色视图约束是宽高150,水平居中。点击按钮后重做约束,宽高变100,且不再居中。


import UIKit import SnapKit class ViewController: UIViewController { lazy var box = UIView() override func viewDidLoad() { super.viewDidLoad() box.backgroundColor = UIColor.orange self.view.addSubview(box) box.snp.makeConstraints { (make) -> Void in make.width.height.equalTo(150) make.centerX.equalTo(self.view) } } //按钮点击 @IBAction func btnTouch(_ sender: AnyObject) { //重做约束 box.snp.remakeConstraints { (make) -> Void in make.width.height.equalTo(100) } } }
请教一下,导航栏的运营商的字体怎么改变颜色啊?
写的真好,如果楼主写一篇异步获取数据那就更好了
楼主 您好:
snp_remakeConstraints. snp_updateConstraints 和 snp_removeConstraints 之后我在 snp_makeConstraints 有什么区别呢?点进去看了一下,它们都是走了一个 for in ,在速度和效率上面哪个更好一点?