返回 导航

Swift

hangge.com

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

作者:hangge | 2016-04-01 09:09
SnapKit文章系列:(代码均已升级至Swift3)
Swift - 自动布局库SnapKit的使用详解1(配置、使用方法、样例)
Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做) --- 当前文章
Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画)
Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)
Swift - 自动布局库SnapKit的使用详解5(样例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.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)
        }
    }
}
评论

全部评论(3)

回到顶部