当前位置: > > > Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做)

Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做)

在之前的文章中我介绍了如何使用SnapKit的 snp.makeConstraints 方法进行各种约束的设置。但有时我们的页面并不是一直固定不变的,这就需要修改已经存在的约束。本文介绍如何更新、移除、代替现有的约束。

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.orangeColor()
        self.view.addSubview(box)
        
        box.snp_makeConstraints { (make) -> Void in
            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.orangeColor()
        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)
        }
    }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作。

打赏支持
评论3
  • 3楼
    2016-04-27 10:15
    半夏

    请教一下,导航栏的运营商的字体怎么改变颜色啊?

    站长回复

    可以改成白色,看我写的这篇文章:Swift - 修改顶部状态栏(statusBar)文字颜色为白色

  • 2楼
    2016-04-08 22:39
    牛牛

    写的真好,如果楼主写一篇异步获取数据那就更好了

    站长回复

    使用NSURLSession可以异步获取数据,我原来写过相关文章,你可以看下:Swift - 使用NSURLSession加载数据、下载、上传文件

  • 1楼
    2016-04-01 17:55
    poppy

    楼主 您好:
    snp_remakeConstraints. snp_updateConstraints 和 snp_removeConstraints 之后我在 snp_makeConstraints 有什么区别呢?点进去看了一下,它们都是走了一个 for in ,在速度和效率上面哪个更好一点?

    站长回复

    1,snp_remakeConstraints相当于先snp_removeConstraints,再snp_makeConstraints。两种方式效率没区别。不过重做约束还是建议用snp_remakeConstraints,不仅少写一个方法,代码逻辑看起来也更清晰。
    2,不同于snp_remakeConstraints重做所有的约束。 snp_updateConstraints用于只更新部分约束。