NSTextView设置.monospacedSystemFont时Xcode弹出无效字体警告的技术问询
解决NSTextView设置系统等宽字体时的CoreText警告问题
我之前帮不少开发者处理过这个问题,核心原因很简单:你直接硬编码了系统等宽字体的私有名称(比如.SFNSMono-Bold),但苹果明确要求必须通过官方提供的API来获取系统UI字体,不能直接写死字体名称——这些内部名称是可能随系统版本变化的,而且CoreText会拒绝这种非正规访问,最终 fallback 到Times-Roman,就出现了你看到的警告。
正确的解决方法有两种,按需选择:
1. 使用NSFont的官方类方法(推荐,最简单)
苹果为NSFont提供了专门的等宽系统字体获取方法,直接调用就能拿到合规的字体对象,完全不会触发警告:
Swift 代码示例:
// 按需调整字体大小和权重(.regular/.bold/.medium等) let monospacedFont = NSFont.monospacedSystemFont(ofSize: 14, weight: .regular) // 应用到你的NSTextView yourTextView.font = monospacedFont
Objective-C 代码示例:
// 指定大小和权重(NSFontWeightRegular/NSFontWeightBold等) NSFont *monospacedFont = [NSFont monospacedSystemFontOfSize:14 weight:NSFontWeightRegular]; // 设置到NSTextView yourTextView.font = monospacedFont;
2. 使用CoreText的CTFontCreateUIFontForLanguage API(更灵活,支持语言配置)
如果需要针对特定语言调整字体,或者更底层的控制,可以用CoreText的官方API:
Objective-C 代码示例:
// kCTFontMonospaceType 指定获取等宽类型的系统UI字体,第二个参数是字体大小,最后一个参数是语言(传NULL用系统默认) CTFontRef monospacedCTFont = CTFontCreateUIFontForLanguage(kCTFontMonospaceType, 14.0, NULL); // 桥接成NSFont对象 NSFont *monospacedFont = CFBridgingRelease(monospacedCTFont); // 应用到NSTextView yourTextView.font = monospacedFont;
额外注意:Interface Builder设置的坑
如果你是在IB里直接设置字体,不要手动输入.monospacedSystemFont这类名称,而是在字体选择器里找到「System」分类下的「Monospaced」选项,这样IB会自动生成合规的代码,不会触发警告。
内容的提问来源于stack exchange,提问作者Vicente Garcia
相关产品推荐
相关产品推荐

