如何设置UILabel字号保持静态不受iOS系统字体设置影响?
iOS固定UILabel字号不受系统设置影响的配置方案
要实现UILabel字号不跟随系统无障碍字体缩放、不随Zoomed放大模式变动,按以下场景配置即可:
1. 屏蔽动态类型(无障碍大字体)的自动缩放
系统自动调大字号的核心原因是控件开启了动态类型适配,分开发模式配置:
- 纯代码开发场景
- 不要使用动态字体初始化方法
UIFont.preferredFont(forTextStyle:),直接使用固定pointSize的方法初始化字体:// 固定16号系统字体,不会随系统字体设置变动 yourLabel.font = UIFont.systemFont(ofSize: 16) - 显式关闭字体自动自适应属性,避免全局配置或者第三方库误开:
yourLabel.adjustsFontForContentSizeCategory = false
- 不要使用动态字体初始化方法
- Storyboard/Xib可视化开发场景
- 选中目标UILabel,在属性检查器的Font选项中,不要选择Text Styles分类下的动态字体样式,直接选择System(系统字体)或者自定义字体,手动填入需要的固定字号
- 取消勾选Font选项下方的
Automatically Adjusts Font复选框,关闭动态类型自动适配
2. 屏蔽Zoomed In放大模式的字号变动
正常情况下使用上述固定字号配置后,放大模式不会修改你代码里写死的字号point值,如果出现字号随放大模式变动的异常,按以下点排查:
- 检查是否在
traitCollectionDidChange:回调中,根据当前视图的size class、displayScale主动修改了UILabel的字号 - 检查项目中是否有UIFont的分类、第三方库通过swizzle交换了字体初始化方法,自动给所有字体加上了放大模式的缩放系数,去掉对应逻辑即可
3. 老项目全局兜底方案
如果是存量项目不想逐个修改控件配置,可以通过UILabel分类实现全局字号锁定,适合临时快速修复场景:
import UIKit extension UILabel { func forceLockFontSize(fixedSize: CGFloat) { self.adjustsFontForContentSizeCategory = false self.font = self.font.withSize(fixedSize) } }
注意:从无障碍合规角度,不建议对App内所有文本全局固定字号,会影响视障用户的正常使用,仅在相机水印、弹窗固定标识等必须保持字号不变的特殊场景使用上述配置。
内容的提问来源于stack exchange,提问作者RainCast
相关产品推荐
相关产品推荐

