iOS小知识之SnapKit配合抗拉伸抗压缩属性的使用

4,687 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

SnapKit使用的人应该在大多数,可能有大多数人,包括我,之前并没有配合使用到UIView的抗拉伸、抗压缩属性,今天我们来看一下如何配合使用。

HuggingPriority-抗拉伸

在我们平常开发中经常会遇到这种情况,有两个View放在同一行的情况,如果两个View不能够填满整个空间,一般的做法是固定一个View的长度,拉伸另一个View,如果不固定某一View的长度,我们就不能确定哪一个View会被拉伸。
这时我们设置其中不需要拉伸View的HuggingPriority为high,就可以让其不被拉伸。 API:func setContentHuggingPriority( _ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis),第一个参数为优先级,第二个参数为水平方向或者竖直方向

截屏2021-10-19 下午4.03.15.png

如图这种情况,我们可以设置左边Label的抗拉伸强度为defaultHigh,这样在左右两边的Label有空隙的时候,会拉伸右边的Label。实现代码如下:

leftLabel.snp.makeConstraints { make **in**

    make.top.equalToSuperview().offset(200)

    make.left.equalToSuperview().offset(20)

    make.right.equalTo(rightLabel.snp.left).offset(-10).priority(.medium)

}

leftLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)

rightLabel.snp.makeConstraints { make **in**

    make.top.equalTo(leftLabel)

    make.left.equalTo(leftLabel.snp.right).offset(10).priority(.medium)

    make.right.equalToSuperview().offset(-20)

}
CompressionResistancePriority-抗压缩

与HuggingPriority-抗拉伸相对应的就是CompressionResistancePriority-抗压缩。 API为func setContentCompressionResistancePriority( _ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis),第一个参数为优先级,第二个参数为水平方向或者竖直方向.
如下图所示

截屏2021-10-19 下午4.13.07.png

如上图所示,两个label中,右边label文字过长,在布局中如果不限定某一lable的长度,那其中某一个的label将会被压缩,如果我们设置leftLabel的抗压缩属性CompressionResistancePriority为high,设置rightLabel的CompressionResistancePriority为low,那么就会自动拉伸RightLabel,而leftLabel就会维持原状。实现代码如下

leftLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)

rightLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

这样就可以不用限定某一个View的宽度,就可以自动拉伸需要拉伸或者压缩的View。