一、基本用法
snp是手动布局神器,在做约束的时候经常用到,首先导入 pod 依赖
pod 'SnapKit', '~> 5.0.0'
1.添加约束
let button = UIButton()
addSubView(button)
button.snp.makeConstraints { (make) in
// 上方间距
make.top.equalTo(352 * UIScreen.screenWidth / 375)
// 高和imageView相同
make.height.equalTo(imageView.snp.height)
// centerX和父视图一样
make.centerX.equalToSuperview()
// 宽度比imgView少10
make.width.equalTo(imageView.snp.width).offset(-10)
}
注意:
- 如果要使用.equalToSuperview(),必须先把该控件添加到父视图上,否则会报错Expected superview but found nil when attempting make constraint
equalToSuperview
- 如果要使用equalTo(imageView.snp.width),imgView必须已经添加到父视图上,否则会报错
- make.left.equalTo(20)是相对于父视图的
- 关于offset:偏移量,是相对于equalTo()里面的控件位置而言的
+ | - | |
---|---|---|
top/bottom/centerY | 向下偏移 | 向上偏移 |
left/right/centerX | 向右偏移 | 向左偏移 |
2.更新约束
button.snp.updateConstraints { (make) in
// button的width变为300
make.width.equalTo(300)
}
注意:
- 更新是指在存在的前提下更新,所以要更新的约束必须存在,负责会报错
- 其他的约束还是维持原来的样子
3.重设约束
button.snp.remakeConstraints { (make) in
make.width.equalTo(300)
make.top.equalToSuperview().offset(10)
make.left.equalTo(20)
make.height.equalTo(500)
}
注意:
- 重设约束会把原来所有的约束都删除掉,所以重新设置时要设置周全
二、进阶用法
1.确定父视图宽高
let contentView = MyContentView()
view.addSubview(collectionView)
contentView.snp.makeConstraints {(make) in
make.width.equalTo(300)
make.top.equalToSuperview().offset(10)
make.left.equalTo(20)
make.height.equalTo(500)
// 确定父视图高度
make.height.equalToSuperView()
// 确定父视图宽度
make.with.equalToSuperView()
}
写在最后:约束最好不要和frame混用
contentView.snp.makeConstraints {(make) in
make.width.equalTo(300)
make.top.equalToSuperview().offset(10)
make.left.equalTo(20)
make.height.equalTo(500)
}
// 会冲突,变成四不像
contentView.frame.size = CGSize(width: 200, height: 100)