在 NSAttributedString 中用另一个替换 NSColor
Replacing NSColor with another in NSAttributedString
我正在尝试将 NSAttributedString
中的一种颜色替换为另一种颜色,以在 Mojave 之前的应用程序中启用暗模式。我有一个很长的 NSTextView
来保存字符串。
是否有任何方法可以重新映射或改变已在 NSTextView 中设置的颜色,类似于 Mojave 暗模式对 NSColor.textColor
所做的?如果打开多个文档,通过逐一枚举范围和属性来格式化字符串非常慢。
非常感谢使用 Swift 或 Objective-C 的提示和技巧!
简答:制作你自己的 "adaptable" 颜色。
长答案
创建一个 NSColor
的子class,它有两个只读的(为了与
NSColor 是不可变的)实例 NSColor
属性
标准色和深色。
给get/set加一个class属性应该用哪个颜色
定义您自己的 init
/new
方法,这些方法采用基本的标准颜色和深色。
将 NSColor
的所有创建方法添加到您的颜色中 @interface
将它们全部标记为 NS_UNAVAILBLE
– 这可以防止意外使用
他们。
覆盖所有需要的方法 – 参见 NSColor.h
(使用“跳转到
Definition” in Xcode 来打开它。每个重写只是直接指向
方法到适当的标准或深色。这只是一个
一堆样板代码。
现在用你的子class给你的NSAttributedString
上色。当你
希望切换模式使用 class 属性 切换所有颜色
即时重绘字符串。
HTH
我正在尝试将 NSAttributedString
中的一种颜色替换为另一种颜色,以在 Mojave 之前的应用程序中启用暗模式。我有一个很长的 NSTextView
来保存字符串。
是否有任何方法可以重新映射或改变已在 NSTextView 中设置的颜色,类似于 Mojave 暗模式对 NSColor.textColor
所做的?如果打开多个文档,通过逐一枚举范围和属性来格式化字符串非常慢。
非常感谢使用 Swift 或 Objective-C 的提示和技巧!
简答:制作你自己的 "adaptable" 颜色。
长答案
创建一个
NSColor
的子class,它有两个只读的(为了与 NSColor 是不可变的)实例NSColor
属性 标准色和深色。给get/set加一个class属性应该用哪个颜色
定义您自己的
init
/new
方法,这些方法采用基本的标准颜色和深色。将
NSColor
的所有创建方法添加到您的颜色中@interface
将它们全部标记为NS_UNAVAILBLE
– 这可以防止意外使用 他们。覆盖所有需要的方法 – 参见
NSColor.h
(使用“跳转到 Definition” in Xcode 来打开它。每个重写只是直接指向 方法到适当的标准或深色。这只是一个 一堆样板代码。现在用你的子class给你的
NSAttributedString
上色。当你 希望切换模式使用 class 属性 切换所有颜色 即时重绘字符串。
HTH