Massonry 与 SnapKit 同源,所以大部分的使用规则和方法都是相似的,这里做个简单的笔记
设置
抗拉伸、抗压缩
等级
只要针对UILabel并排时的布局
![]()
/// 抗拉伸 、 抗压缩使用
func contentPriorityDemo() {
let leftlb: UILabel = UILabel()
leftlb.text = "我是左边"
leftlb.backgroundColor = .yellow
self.view.addSubview(leftlb)
let rightlb: UILabel = UILabel()
rightlb.text = "我是右边"
rightlb.backgroundColor = .blue
self.view.addSubview(rightlb)
leftlb.snp.makeConstraints { (make) in
make.left.equalToSuperview().offset(10)
make.right.equalTo(rightlb.snp.left)
make.height.equalTo(64)
make.centerY.equalToSuperview()
}
rightlb.snp.makeConstraints { (make) in
make.right.equalToSuperview().offset(-10)
make.height.centerY.equalTo(leftlb)
}
/// 设置抗拉伸等级
leftlb.setContentHuggingPriority(.defaultHigh, for: .horizontal)
/// 与上面的效果相同
/// rightlb.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
}
尺寸比例设置
![]()
/// 尺寸比例大小设置
func multipCOnstranintsDemo() {
let outBox: UIView = UIView()
outBox.backgroundColor = .orange
self.view.addSubview(outBox)
let inBox: UIView = UIView()
inBox.backgroundColor = .green
outBox.addSubview(inBox)
outBox.snp.makeConstraints { (make) in
make.size.equalTo(CGSize(width: 100, height: 100))
make.center.equalToSuperview()
}
/// 设置:inBox的宽高尺寸 比 outBox的宽高都小50
// inBox.snp.makeConstraints { (make) in
// make.size.equalTo(outBox).offset(-50)
// make.center.equalTo(outBox)
// }
/// 设置:inBox的宽高 是 outBox宽高的 一半
inBox.snp.makeConstraints { (make) in
make.center.equalTo(outBox)
make.size.equalTo(outBox).multipliedBy(0.5)
}
}
约束保存与更新
这是SnapKit特有的,日常使用很方便
/// 保存约束(便于更新)
var topConstraint: Constraint?
/// 约束保存与更新
func constraintsSaveAndUpdateDemo() {
box.backgroundColor = .red
self.view.addSubview(box)
box.snp.makeConstraints { (make) in
make.height.equalTo(64)
make.width.equalTo(self.view)
/// 保存约束
self.topConstraint = make.top.equalToSuperview().offset(100).constraint
}
/// 更新约束
self.topConstraint?.update(inset: 200)
}
约束等级设置、约束更新带动画
![]()
/// snap约束更新带动画
func constrainsUpdateWithAnimationDemo() {
box.backgroundColor = .orange
self.view.addSubview(box)
/// 设置box的宽高不能超过屏幕
/// 并且设置宽高的值得优先级250(默认的优先级是1000,
/// 这是最高等级,不能设置超过1000,否则编译错误)
box.snp.makeConstraints { (make) in
make.width.height.lessThanOrEqualTo(self.view.snp.width)
make.width.height.lessThanOrEqualTo(self.view.snp.height)
make.center.equalToSuperview()
make.width.height.equalTo(50 * self.scale).priority(250)
}
/// 添加点击事件,每点击一次放大box
let tapSingle = UITapGestureRecognizer(target: self, action: #selector(tapSingleDid))
self.view.addGestureRecognizer(tapSingle)
}
/// 设置发大倍数,并且设置动画
@objc func tapSingleDid() {
self.scale += 0.2
self.view.setNeedsUpdateConstraints()
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
/// 更新box约束
override func updateViewConstraints() {
self.box.snp.updateConstraints { (make) in
make.width.height.equalTo(100 * self.scale).priority(250)
}
super.updateViewConstraints()
}
网友评论