NSTextView在黑暗模式下几乎以黑色绘制黑色

时间:2018-10-16 06:36:06

标签: cocoa nstextview macos-darkmode

当我在黑暗模式下构建macOS应用程序时,我的某些文本视图(NSTextView)在几乎黑色的背景上呈现黑色文本。在Interface Builder中,在“属性”检查器中,“文本颜色”设置为系统“默认(文本颜色)”,我认为这是正确的。实际上,在Interface Builder中,此文本可根据需要在暗模式下呈现白色,在亮模式下呈现黑色。我已经在代码中搜索了可能会通过编程将此视图中的文本颜色设置为黑色但找不到的任何行。为什么我的文字总是黑色?

4 个答案:

答案 0 :(得分:5)

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

NSForegroundColorAttributeName : NSColor.controlTextColor

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

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

我发现此方法记录在案:

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

当为是时,启用自适应色彩映射模式。在此模式下,在深色有效外观下,NSTextView会将所有颜色映射为 NSColorTypeComponentBased通过每当它们 传入和传出模型对象NSTextStorage。例如, 渲染时,与NSColorPanel和NSFontManager进行交互,以及 从/转换为剪贴板和外部格式,颜色 值在模型和渲染上下文之间转换。注意 颜色转换算法会压缩亮度范围 因此,它不会保留两者之间的往返保真度 光明和黑暗的外观。它可能不适用于富文本 创作,因此最好提供一个命令或首选项 您的用户可以在不使用此选项的情况下查看或编辑其文档 模式。 * /

答案 3 :(得分:0)

NSTextView扩展用于“普通”(非归因)字符串。在亮或暗模式下均可工作:

extension NSTextView {
    static let DefaultAttribute =
        [NSAttributedString.Key.foregroundColor: NSColor.textColor] as [NSAttributedString.Key: Any]

    var stringValue: String {
        return textStorage?.string ?? ""
    }

    func setString(_ string: String) {
        textStorage?.mutableString.setString("")
        append(string)
    }

    func append(_ string: String) {
        let attributedText = NSAttributedString(string: string, attributes: NSTextView.DefaultAttribute)
        textStorage?.append(attributedText)
    }
}