设置字体大小与粗细后adjustsFontSizeToFitWidth不生效的解决方法咨询
解决UILabel设置固定字号粗细后adjustsFontSizeToFitWidth失效的问题
我之前也碰到过一模一样的问题!当你直接用systemFontOfSize:weight:设置固定大小的粗体字时,确实会出现adjustsFontSizeToFitWidth失效的情况——本质原因是这种方式创建的字体默认关闭了动态缩放相关的特性,和UILabel的自动缩放逻辑产生了冲突。下面给你几个可行的解决方案,按推荐程度排序:
方案1:使用UIFontMetrics(iOS 11+ 推荐)
UIFontMetrics是苹果推出的用于适配动态类型和字体缩放的工具,用它创建的字体既能保留你指定的初始大小和粗细,又能完美支持UILabel的自动缩放功能。代码示例:
// 先创建基础的粗体字体 UIFont *baseFont = [UIFont systemFontOfSize:24 weight:UIFontWeightSemibold]; // 用UIFontMetrics处理,这里选择body文本样式,你也可以根据需求换成其他样式 UIFont *scalableFont = [[UIFontMetrics metricsForTextStyle:UIFontTextStyleBody] scaledFontForFont:baseFont]; // 给标签设置字体 self.title.font = scalableFont; // 开启自动缩放并设置最小缩放比例 self.title.adjustsFontSizeToFitWidth = YES; self.title.minimumScaleFactor = 0.4; // 确保换行模式正确(默认是NSLineBreakByTruncatingTail,这个模式下缩放才会生效) self.title.lineBreakMode = NSLineBreakByTruncatingTail;
方案2:调整属性设置顺序+检查换行模式
有时候属性设置的顺序会影响最终效果,确保先设置字体,再开启自动缩放相关属性,同时确认换行模式不是NSLineBreakByClipping(这个模式会阻止字体缩放):
// 先设置字体 self.title.font = [UIFont systemFontOfSize:24 weight:UIFontWeightSemibold]; // 再配置自动缩放属性 self.title.adjustsFontSizeToFitWidth = YES; self.title.minimumScaleFactor = 0.4; // 明确设置换行模式,避免默认值被意外修改 self.title.lineBreakMode = NSLineBreakByTruncatingTail;
方案3:使用UIFontDescriptor(iOS 7+)
通过字体描述符来构建字体,可以更精细地控制字体特性,确保缩放能力被保留:
// 基于系统默认文本样式创建字体描述符 UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody]; // 修改描述符的字号 fontDescriptor = [fontDescriptor fontDescriptorWithSize:24]; // 设置Semibold粗细(iOS 9+支持UIFontDescriptorTraitSemibold,低版本可以用UIFontDescriptorTraitBold) fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitSemibold]; // 从描述符创建字体 UIFont *scalableFont = [UIFont fontWithDescriptor:fontDescriptor size:0]; self.title.font = scalableFont; // 开启自动缩放 self.title.adjustsFontSizeToFitWidth = YES; self.title.minimumScaleFactor = 0.4;
额外检查点
- 确保你的标签宽度是固定的(比如通过Auto Layout约束明确限制了宽度,而不是随内容自动拉伸)——如果标签宽度能自动扩展,
adjustsFontSizeToFitWidth根本不会触发缩放。 - 检查是否有其他代码在后续逻辑中覆盖了标签的字体或者自动缩放属性。
内容的提问来源于stack exchange,提问作者tentmaking




