也许你在写OC的时候已经用过了Masonry这个第三方库来写自动布局,今天我们来说说Swift版本的Masonry第三方库SnapKit

SnapKit

今天我们来做一个稍稍复杂的东西。

snp_updateConstraints

效果图如下。

Show Your Code

var button: UIButton!
var scacle:CGFloat = 1.0

override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.whiteColor()
        button = UIButton(type: UIButtonType.System)
        button.setTitle("变大", forState: UIControlState.Normal)
        button.layer.borderWidth = 3
        button.layer.borderColor = UIColor.redColor().CGColor
        button.addTarget(self, action: "change", forControlEvents: UIControlEvents.TouchUpInside)
        view.addSubview(button)
    }
    
     override func updateViewConstraints() {
        button.snp_updateConstraints { (make) -> Void in
            make.center.equalTo(self.view)
            make.width.equalTo(self.button.bounds.size.width * self.scacle ).priorityLow()
            make.height.equalTo(self.button.bounds.size.height * self.scacle).priorityLow()
            make.height.width.lessThanOrEqualTo(self.view)
        }
        super.updateViewConstraints()
    }

    func change() {
        scacle += 0.5
        self.view.setNeedsUpdateConstraints()
        self.view.updateConstraintsIfNeeded()
        UIView.animateWithDuration(0.5) { () -> Void in
            self.view.layoutIfNeeded()
        }
    }

我们先实例化了一个按钮。然后重写了updateViewConstraints()方法,来改变button 的约束布局。

override func updateViewConstraints() {
//调用 SnapKit的 snp_updateConstraints 方法
        button.snp_updateConstraints { (make) -> Void in
        //使 button 中心始终和 父视图一致
            make.center.equalTo(self.view)
            //button 的宽度和高度 首先和原始的一样,之后成 scacle倍数改变 。并且优先级为最低。这里我们不对优先级有更多的讲解,之后会专门讲
            make.width.equalTo(self.button.bounds.size.width * self.scacle ).priorityLow()
            make.height.equalTo(self.button.bounds.size.height * self.scacle).priorityLow()
            //宽度和高度都不能超过父视图
            make.height.width.lessThanOrEqualTo(self.view)
        }
        //这个是我们必须调用的。
        super.updateViewConstraints()
    }

我们在点击按钮的时候调用下边的方法

func change() {
            //改变scacle  的值
        scacle += 0.5
        //告诉self.view约束需要更新
        self.view.setNeedsUpdateConstraints()
        //告诉self.view检测是否需要更新约束,若需要则更新,下面添加动画效果才起作用
        
        /*
        对于updateConstraintsIfNeeded这个方法并不是必须的,但是有时候不调用就无法起到我们的效果。但是,官方都是这么写的,从约束的更新原理上讲,这应该写上。我们要使约束立即生效,就必须调用layoutIfNeeded此方法。
        */
        self.view.updateConstraintsIfNeeded()
        UIView.animateWithDuration(0.5) { () -> Void in
            self.view.layoutIfNeeded()
        }
    }

dowhilenet
654 声望10 粉丝

引用和评论

0 条评论