也许你在写OC的时候已经用过了Masonry
这个第三方库来写自动布局,今天我们来说说Swift版本的Masonry
第三方库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()
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。