在黑暗模式下,NSTextView在几乎黑色的黑色上绘制黑色

Jer*_*ock 11 cocoa nstextview macos-darkmode

当我在暗模式下构建我的macOS应用程序时,我的一些文本视图(NSTextView)在几乎黑色的背景上呈现黑色文本.在Interface Builder中,在Attributes Inspector中,"Text Color"设置为系统"Default(Text Color)",我认为这是正确的.实际上,在Interface Builder中,根据需要,此文本在暗模式下呈现白色,在光模式下呈现黑色.我搜索了我的代码中的任何行,我可能会在此视图中将文本颜色设置为黑色,但找不到任何行.为什么我的文字总是黑的?

Jer*_*ock 8

我注意到,错误的文本视图通过可可绑定将其“属性字符串”绑定到了返回普通而非属性NSString对象的方法。我之所以这样做,是因为几年前我写这个应用程序时很懒,而且运行良好。事实证明,这种失配是问题所在。解决方法是修改这些方法以返回NSAttributedString,以及包含键/值对的属性字典

NSForegroundColorAttributeName : NSColor.controlTextColor
Run Code Online (Sandbox Code Playgroud)

可能发生的情况是,当属性字符串绑定获得非属性字符串时,Cocoa可以执行您可能想要的操作。Cocoa并没有添加异常,而是应用了一些“默认”属性,其中包括自1984年以来一直是macOS默认设置的黑色文本颜色–直到出现“暗模式”时才完全明智!好的,Apple将此默认值从黑色更改为controlTextColor可能很好,但是显然他们没有。

结论:我们再也无法避免将文本视图的属性字符串绑定到普通的非属性字符串。

或者,您可以使用@Ely的答案并绑定到value。但是,如果您尝试这样做,并且value在Bindings Inspector中没有看到绑定,但是看到了data绑定,则是由于NSTextField文档中的以下说明:

[ value]绑定仅在NSTextView配置为使用单个字体显示时可用。

然后

[ data]绑定仅在NSTextView配置为允许多种字体时可用。

轮到它们被配置为允许多种字体的含义是,在“属性”检查器中,“ 允许富文本格式”复选框处于启用状态。相反, 配置为使用单一字体显示意味着“ 允许富文本格式”复选框处于关闭状态。


Dou*_*ari 8

使用此代码(macOS Catalina 版本 10.15.3)后,它对我有用:

if #available(OSX 10.14, *) {         
    textView.usesAdaptiveColorMappingForDarkAppearance = true
} else {
    // Fallback on earlier versions - do nothing
}
Run Code Online (Sandbox Code Playgroud)

我在方法中发现了这一点:

/************************* 黑暗模式 ******************** *******

YES 时,启用自适应颜色映射模式。在这种模式下,在深色有效外观下,NSTextView 通过在进入和离开模型对象 NSTextStorage 时反转亮度来将所有颜色映射到 NSColorTypeComponentBased。例如,在渲染、与 NSColorPanel 和 NSFontManager 交互以及从/向粘贴板和外部格式转换时,颜色值在模型和渲染上下文之间转换。请注意,颜色转换算法会压缩亮度范围,因此不会保留明暗外观之间的往返保真度。它可能不适合富文本创作,因此最好为您的用户提供命令或首选项,以便在没有此选项的情况下或在轻量模式下查看和编辑他们的文档。*/


Ely*_*Ely 5

如果您在 NSTextView 中使用纯文本(例如,因为您需要滚动视图),只需绑定到value属性而不是attributedString. 此绑定将使用控件的文本颜色设置,并与暗模式完美配合。