You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让macOS 14 Sonoma应用响应新的Text Size设置?

如何让自研macOS应用响应Sonoma的系统Text Size设置

macOS 14 Sonoma新增的「设置->辅助功能->显示」中的Text Size设置,本质是系统级的动态文本大小调整机制。以下是不同开发场景下的实现方案:

一、Mac Catalyst适配场景(优先方案)

Mac Catalyst应用需要开启iOS动态类型支持,并映射到macOS的系统设置:

  1. 开启动态类型支持
    在项目的Info.plist中添加UIApplicationSupportsDynamicTextSize键,设置值为YES(也可在Xcode项目设置的「Info -> Custom iOS Target Properties」中添加)。

  2. 使用动态类型字体
    避免使用固定大小字体,改用系统偏好字体样式,并开启自动适配:

// 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;
  1. 手动监听设置变更(自定义控件场景)
    如果需要对自定义控件做特殊处理,可监听动态类型变更通知:
NotificationCenter.default.addObserver(
    forName: UIContentSizeCategory.didChangeNotification,
    object: nil,
    queue: .main
) { _ in
    // 刷新控件字体或界面
    label.font = UIFont.preferredFont(forTextStyle: .body)
}

二、原生AppKit场景

原生AppKit应用需要使用动态文本样式字体,并开启控件的自动适配:

  1. 基础控件适配
// 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;
  1. 监听系统设置变更
    若需手动处理变更,可监听字体描述符变更通知:
NotificationCenter.default.addObserver(
    forName: NSFontDescriptor.didChangeNotification,
    object: nil,
    queue: .main
) { _ in
    textField.font = NSFont.preferredFont(forTextStyle: .body)
}

三、SwiftUI场景

SwiftUI需使用系统文本样式字体,macOS 14+会自动响应Text Size设置:

  1. 基础适配
Text("动态文本示例")
    .font(.body) // 使用系统动态文本样式,而非固定大小(如.font(.system(size: 16)))
  1. 自定义响应逻辑
    可通过环境变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:15:01