iOS15与iOS14下adjustsFontSizeToFitWidth字体缩放表现差异咨询
问题描述
在Xcode 13开发环境下使用UILabel的.adjustsFontSizeToFitWidth属性时,观测到iOS 15系统上的文本字号缩小幅度明显大于iOS 14系统,暂未在苹果官方版本发布说明中查询到对该变动的公开解释。

实际观测现象如下:
- 为UILabel设置完全相同的frame参数时,iOS 14与iOS 15最终渲染的文本字号存在明显差异,差异比例约为高度1、宽度4。
- 若增大UILabel的frame高度,iOS 15上的缩放表现会和iOS 14的原有表现完全一致,且该高度调整不会对iOS 14上的渲染效果产生任何影响。
复现代码如下:
// 第一个UILabel在iOS 15上的渲染字号小于iOS 14上的渲染效果 UILabel *yourLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 160, 40)]; [yourLabel1 setTextColor:[UIColor brownColor]]; [yourLabel1 setBackgroundColor:[UIColor systemRedColor]]; [yourLabel1 setFont:[UIFont boldSystemFontOfSize:52]]; [yourLabel1 setText:@"HELLO"]; yourLabel1.minimumScaleFactor = 0.2; yourLabel1.adjustsFontSizeToFitWidth = YES; [self.view addSubview:yourLabel1]; // 第二个UILabel在iOS 15和iOS 14上渲染效果一致,仅高度参数做了调整 UILabel *yourLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 300, 160, 60)]; [yourLabel2 setTextColor:[UIColor brownColor]]; [yourLabel2 setBackgroundColor:[UIColor systemRedColor]]; [yourLabel2 setFont:[UIFont boldSystemFontOfSize:52]]; [yourLabel2 setText:@"HELLO"]; yourLabel2.minimumScaleFactor = 0.2; yourLabel2.adjustsFontSizeToFitWidth = YES; [self.view addSubview:yourLabel2];
核心疑问:iOS 15是否修改了UILabel的字体自适应缩放逻辑?
答案
iOS 15确实对UILabel的字体自适应缩放逻辑做了隐性调整,该变动未在版本发布说明中重点标注:
- iOS 14及更早系统版本中,开启
.adjustsFontSizeToFitWidth属性后,系统仅以「文本宽度适配Label宽度」为缩放终止条件,不会校验缩放后字体的实际行高是否超出Label高度范围,即便文本上下部分被Label边界裁切,也不会继续缩小字号。 - iOS 15及之后系统版本中,开启
.adjustsFontSizeToFitWidth属性后,系统会同时校验宽度、高度两个维度的适配性:完成宽度适配后,系统会额外检查当前字号对应的完整行高(包含字体上行部、下行部的预留空间)是否能完全容纳在Label的高度范围内,若无法容纳,会继续缩小字号直到文本完整显示、不被边界裁切。
观测到的现象与该逻辑变动完全匹配:示例中使用的52号加粗系统字体默认行高约为60pt,当Label高度设为60pt时,宽度适配后的字号行高刚好可以完整放入Label,两个系统的缩放结果完全一致;当Label高度设为40pt时,iOS 15会在宽度适配的基础上继续缩小字号,直到行高能塞进40pt的高度范围,最终渲染字号自然小于iOS 14上的显示效果。
如果需要统一新旧系统的显示表现,最稳妥的实现方式是不给单行UILabel设置固定高度约束,仅约束位置与宽度参数,让Label根据当前渲染字号自适应高度即可,该写法在iOS 14、iOS 15系统上的表现完全一致。
内容的提问来源于stack exchange,提问作者Misael Landeros
相关产品推荐
相关产品推荐

