试图讲清楚自动布局的压缩和抗压缩优先级

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

有时不得不说,一些苹果 API 非常难理解。比如 setContentHuggingPriority(内容拥抱优先级)和 setContentCompressionResistancePriority(内容抗压缩优先级)这两个 API。

每次我用到的时候都要查一遍其用法,理解难度比较高,而且不好记忆,今天试图讲清楚这两个方法的用处,并希望能一次记住,以后直接使用不再费时间查资料了。

两个概念

要想用好这两个方法,首先要知道两个概念,即:内容区域视图区域

内容区域指的是这个视图中的内容所占大小 ,比如一个 UILabel,内容区域就是它的文本占用的大小

视图区域指的是这个视图的大小,比如一个 UILabel,当你给它约束的宽度为屏幕的宽时,视图区域就是整个屏幕的大小。

setContentHuggingPriority

这个属性是保持内容区域大小的能力,直译过来叫内容拥抱优先级,当视图区域大于内容区域时,这个方法就会生效。

我们来用一个例子说明:在水平方向上,有两个 Label,暂且叫 leftLabel (红色背景)和 rightLabel(蓝色背景)。

leftLabel 拥有以下约束:

  1. 距离屏幕左边 0

  2. 距离屏幕上边 50

rightLabel 拥有以下约束:

  1. 左边贴着 leftLabel 的右侧

  2. 距离屏幕上边 50

  3. 距离屏幕右边 0

这种情况下,两个 Label 占据整个屏幕,但没有指定各自的宽度,就会导致一种约束混乱。我们先设置 leftLabel 的文本为 ApplerightLabel 的文本为 Swift,看下效果:

可以看到,默认情况下 leftLabel 占据更多的空间,那么如果我们想让 rightLabel 拥有更多的空间,只需要让 leftLabel "抱得更紧" ,也就是需要设置 setContentHuggingPriority 更高的优先级。

less 复制代码
leftLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
rightLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)

因为 leftLabel 的拥抱优先级高,所以当视图区域大于内容区域时,leftLabel 会"抱在一起":

setContentCompressionResistancePriority

这个方法是抵抗压缩的能力 ,或者抵抗缩小的能力,跟上一个属性相反,直译过来叫内容抗压优先级

需要注意的是,当内容区域超过视图区域时,它就会起作用。

还是上边的例子,我们先把 leftLabelrightLabel 多加一些文本:

ini 复制代码
leftLabel.text = "AppleAppleAppleAppleApple"
rightLabel.text = "SwiftSwiftSwiftSwiftSwift"

两个文本因为太长无法同时显示完整,默认情况下,leftLabel 会展示完整,rightLabel 显示不下的地方展示...:

如果我们想让 rightLabel 展示完整,只需要让 rightLabel抗压缩能力变强 (因为它被压缩了,想不被压缩就得提高抗压能力),也就是需要设置 setContentHuggingPriority 更高的优先级,相反把 leftLabel抗压缩能力变弱

less 复制代码
rightLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
leftLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

再看下效果,已经满足了我们的需求:

总结

这两个方法都可以设置垂直水平 两个方向上的约束,我们本次 demo 都是以水平方向.horizontal为例的。

简单的记忆方法

setContentHuggingPriority,Hugging 是拥抱的意思,优先级越高,抱的越紧,抱紧之后所有的剩余空间都会被压缩掉,最终视图紧紧抱着内容。

setContentCompressionResistancePriority,这个方法是抵抗被压缩的能力。你可以想象成用力按压一个弹簧,弹簧的抗压缩能力越高,就越不容易被压缩,抗压缩能力越低,越容易被压缩。

所以,通过调整这两种优先级,你可以控制垂直方向和水平方向上多个视图,哪些视图应该首选保持原始大小(高优先级),哪些可以灵活改变(低优先级)。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
Se7en丶潇洒哥3 小时前
Xcode 16 上传AppStore遇到第三方库 bitcode 的问题
ios·xcode·appstore·xcode 16·bitcode
鸽芷咕13 小时前
【C++报错已解决】std::ios_base::floatfield
开发语言·c++·ios
浏览器爱好者16 小时前
如何在iPad上设置Chrome为默认浏览器
chrome·ios·ipad
mqiqe1 天前
云计算Openstack Swift
云计算·openstack·swift
归辞...1 天前
「iOS」——KVC
macos·ios·cocoa
阿里技术1 天前
如何让 Android 的前端页面像 iOS 一样“优雅”?
android·前端·ios
蟹屋在海边1 天前
iOS OC 底层原理之 category、load、initialize
ios
刘小哈哈哈1 天前
iOS 使用使用渐变色生成图片
ios·cocoa·xcode
weixin_408951351 天前
android和ios双端应用性能的测试工具
android·ios·性能优化·性能测试·测试覆盖率·帧率·安卓性能测试
临海听风V1 天前
iOS 中的 sqlite-shm 和 sqlite-wal 文件丢失
jvm·ios·sqlite