返回 导航

Swift

hangge.com

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:实现一个计算器界面)

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)
        }
    }
}

2,带有动画效果
配合 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)

回到顶部