OC下的autolayout神器Masonry大家已经很熟悉了。但是masonry在swift下使用并不方便。所以同一个团队开发出了swift下的autolayout库:SnapKit
snapkit从0.14开始支持swift2.0并且支持iOS7。不过常规的导入方法只支持iOS8.0+。
- 1 GitHub链接:https://github.com/SnapKit/SnapKit
学习一下第三方的约束管理。其中SnapKit适用于Swift,Masonry适用于OC。
-
2、安装:
1.直接下载:在Github上下载SnapKit,找到SnapKit.framework,然后放到自己的工程中即可。SnapKit.framework文件包括:
屏幕快照 2016-04-08 上午11.47.00.png2.Cocoapods安装
在项目的Podfile下添加如下信息 在终端中执行:pod install(注意路径是当前项目中Podfile锁在路径)
platform :ios, '8.0' use_frameworks! target '你的工程名称' do pod 'SnapKit' end
SnapKit本身不支持IOS7,如果希望SnapKit支持IOS7版本,需要在自己的项目的 Build Setting 中搜索的 OTHER_SWIFT_FLAGS,在其下面添加 -DSNAPKIT_DEPLOYMENT_LEGACY,如下图所示:(否则会报错!)
在使用之前,先看一下Snapkit官方文档翻译
swift let box = UIView() superview.addSubview(box) box.snp_makeConstraints { (make) -> Void in //注释:box距离父视图上下左右边距都是20像素 make.edges.equalTo(superview).inset(UIEdgeInsetsMake(20, 20, 20, 20)) }
-
如果你想 视图 view.left 大于等于 label.left ,执行下面代码:
swift //下面这两者的约束是完全一样的 make.left.greaterThanOrEqualTo(label) make.left.greaterThanOrEqualTo(label.snp_left)
-
3.严格检测(Strick Checks)
swift make.top.equalTo(42) make.height.equalTo(20) make.size.equalTo(CGSizeMake(50,100)) make.edges.equalTo(UIEdgeInsetsMake(10,0,10,0)) make.left.equalTo(view).offset(UIEdgeInsetsMake(10,0,10,0))
-
4.学习优先级
- priority: 允许您指定一个确切的优先级
- priorityHigh: 高优先级 等价于 UILayoutPriority.DefaultHigh
- priorityMedium:中优先级
- priorityLow:低优先级 UILayoutPriority.DefaultLow
优先级可以放在约束链的结束处,例如
swift //当前视图的左边>=label的底部 低优先级 make.left.greaterThanOrEqualTo(label.snp_left).priorityLow() //当前视图与label的顶部齐平,优先级:600 make.top.equalTo(label.snp_top).priority(600)
-
5.组成,组成,组成
SnapKit 也可以提供一些便利的方法来同时创建多约束1.edges(边缘)
swift //让当前视图 的 上下左右(top,left,bottom,right) 等于 view2 make.edges.equalTo(view2) // make top = superview.top + 5; left = superview.left +10 // bottom = superview.bottom -15; right = superview.right - 20 make.edges.equalTo(superView).inset(UIEdgeInsetsMake(5,10,15,20))
2.size(尺寸)
swift //当前视图宽高 >= titleLabel make.size.greaterThanOrEqualTo(titleLabel) //make width = superview.width + 100; height = superview.height -50 //即 当前视图宽 = 父视图 + 100,高 = 父视图.高 - 50 make.size.equalTo(superview).offset(CGSizeMake(100, -50))
3.center(中心)
swift //当前视图与 button1中心相同 (centerX 和 centerY) make.center.equalTo(button1) //make centerX = superview.centerX - 5; centerY = superview.centerY +10 make.center.equalTo(superview).offset(CGPointMake(-5,10))
-
可以串连视图属性增加可读性
swift //所有边缘除了top都等于父视图, top为20 make.left.right.bottom.equalTo(superview) make.top.equalTo(20)
-
6.Hold on for dear life
有时候你需要修改已经存在的约束为了移动或者移除、代替约束。在SnapKit 有一些不同的方法更新约束
1.引用(References)
你可以通过将约束的结果赋值给一个局部变量或一个类属性来保持一个特定的约束的引用。您还可以将多个约束引用存储在数组中。swift var topConstraint: Constraint? = nil //当制作约束时 view1.snp_makeConstraints{ (make) -> Void in self.topConstrain = make.top.equalTo(superview).offset(padding.top).constraint make.left.equalTo(superview).offset(padding.left) // 然后接下来你可以这样 self.topConstraint.uninstall() //或者如果你想要更新约束 self.topConstraint.updateOffset(5)
2.snp_updateConstraints(更新约束)
如果你仅仅想更新一个常数给一个约束,你可以使用方法snp_updateConstraints来代替snp_makeConstraintsswift //这是一个苹果官方推荐的添加和更新约束的地方 //这个方法在响应<code>setNeedsUpdateConstraints</code>多次调用 //这个方法可以倍UIKit调用 override func updateConstraints() { self.growingButton.snp_updateConstraints{ (make) -> Void in make.center.equalTo(self); make.width.equalTo(self.buttonSize.width).priorityLow() make.height.equalTo(self.buttonSize.height).priorityLow() make.width.lessThanOrEqualTo(self) make.height.lessThanOrEqualTo(self) } //父类可以调用 super.updateConstraints() }
3.snp_remakeConstraints(重做约束)
snp_remakeConstraints与snp_makeConstraints类似,但是首先会先清除掉所有被SnapKit设置的约束swift func changeButtonPosition() { self.button.snp_remakeConstraints{ (make) -> Void in make.size.equalTo(self.buttonSize) if topLeft { make.top.left.equalTo(10) } else { make.bottom.equalTo(self.view).offset(-10) make.right.equalTo(self.view).offset(-10) } } }