如何让macOS 14 Sonoma应用响应新的Text Size设置?
如何让自研macOS应用响应Sonoma的系统Text Size设置
macOS 14 Sonoma新增的「设置->辅助功能->显示」中的Text Size设置,本质是系统级的动态文本大小调整机制。以下是不同开发场景下的实现方案:
一、Mac Catalyst适配场景(优先方案)
Mac Catalyst应用需要开启iOS动态类型支持,并映射到macOS的系统设置:
开启动态类型支持
在项目的Info.plist中添加UIApplicationSupportsDynamicTextSize键,设置值为YES(也可在Xcode项目设置的「Info -> Custom iOS Target Properties」中添加)。使用动态类型字体
避免使用固定大小字体,改用系统偏好字体样式,并开启自动适配:
// Swift示例 let label = UILabel() label.text = "动态文本示例" label.font = UIFont.preferredFont(forTextStyle: .body) label.adjustsFontForContentSizeCategory = true // 显式开启自动适配
// Objective-C示例 UILabel *label = [[UILabel alloc] init]; label.text = @"动态文本示例"; label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; label.adjustsFontForContentSizeCategory = YES;
- 手动监听设置变更(自定义控件场景)
如果需要对自定义控件做特殊处理,可监听动态类型变更通知:
NotificationCenter.default.addObserver( forName: UIContentSizeCategory.didChangeNotification, object: nil, queue: .main ) { _ in // 刷新控件字体或界面 label.font = UIFont.preferredFont(forTextStyle: .body) }
二、原生AppKit场景
原生AppKit应用需要使用动态文本样式字体,并开启控件的自动适配:
- 基础控件适配
// Swift示例:NSTextField let textField = NSTextField(string: "动态文本示例") textField.font = NSFont.preferredFont(forTextStyle: .body) textField.adjustsFontForContentSizeCategory = true // 关键配置 // NSTextView同理 let textView = NSTextView() textView.font = NSFont.preferredFont(forTextStyle: .body) textView.adjustsFontForContentSizeCategory = true
// Objective-C示例 NSTextField *textField = [[NSTextField alloc] initWithString:@"动态文本示例"]; textField.font = [NSFont preferredFontForTextStyle:NSFontTextStyleBody]; textField.adjustsFontForContentSizeCategory = YES;
- 监听系统设置变更
若需手动处理变更,可监听字体描述符变更通知:
NotificationCenter.default.addObserver( forName: NSFontDescriptor.didChangeNotification, object: nil, queue: .main ) { _ in textField.font = NSFont.preferredFont(forTextStyle: .body) }
三、SwiftUI场景
SwiftUI需使用系统文本样式字体,macOS 14+会自动响应Text Size设置:
- 基础适配
Text("动态文本示例") .font(.body) // 使用系统动态文本样式,而非固定大小(如.font(.system(size: 16)))
- 自定义响应逻辑
可通过环境变量dynamicTypeSize监听变化,实现自定义处理:
struct ContentView: View { @Environment(\.dynamicTypeSize) private var dynamicTypeSize var body: some View { Text("动态文本示例") .font(.body) .onChange(of: dynamicTypeSize) { newSize in // 自定义逻辑,比如调整布局或字体样式 } } }
注意事项
- 确保应用部署目标为macOS 14+(Sonoma),低版本系统无此设置;
- 侧边栏等特殊场景可使用专门的文本样式,如
NSFont.TextStyle.sidebar(AppKit)或UIFont.TextStyle.sidebar(Catalyst)。
内容的提问来源于stack exchange,提问作者HangarRash
相关产品推荐
相关产品推荐

