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

这里每天分享一个 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 的文本为 Apple,rightLabel 的文本为 Swift,看下效果:

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

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

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

setContentCompressionResistancePriority

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

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

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

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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
茶底世界之下5 小时前
Metal 冷启动并发下,Pipeline Cache 为什么必须合并在途编译
ios·swift
weixin_403810136 小时前
用 Python 调 EasyClick iOS 免越狱脚本:开放接口对接步骤与参数
ios·iphone
weixin_403810138 小时前
EasyClick iOS 免越狱自动化脚本怎么写:从环境判断到跑通第一个脚本
运维·ios·自动化
weixin_403810139 小时前
不用越狱也能批量控制 iPhone:EasyClick iOS 免越狱脚本实战
ios·iphone
weixin_4038101310 小时前
iOS 自动化脚本怎么输入文字:代理、输入法与快捷指令三级方案
运维·ios·自动化
黑科技iOS上架1 天前
双引擎解决oc/swift开发引用加固难题
开发语言·ios·swift·审核·ios混淆·执行程序差异化
wechatbot8881 天前
企微第三方自动化开发:原生能力无阉割 API 开放平台介绍
后端·ios·微信·企业微信·ai编程·ipad
黑科技iOS上架1 天前
iOS framework/dylib动态库定向加固实战
macos·ios·objective-c·cocoa·审核·ios混淆·执行程序差异化
可乐鸡翅yeah_2 天前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放