gpt4 book ai didi

macos - 在 NSTextView 中以大写形式呈现一些文本,而不更改底层字符串

转载 作者:行者123 更新时间:2023-12-03 17:02:01 27 4
gpt4 key购买 nike

在 NSTextView 中,是否可以将给定范围的字符串呈现为全部大写,而不更改底层字符串本身?这个想法类似于NSLayoutManager's temporary attributes ,或CSS' text-transform property .

最佳答案

这也许是可能的,但您必须自己实现此类支持。我不相信有任何内置的东西可以做到这一点。

您还必须实现 NSLayoutManager 的自定义子类和 NSGlyphGenerator 的自定义子类。您的自定义布局管理器类将具有类似于临时属性接口(interface)的接口(interface)。这是因为内置的临时属性功能不支持修改布局的属性,但更改字符的大小写会修改布局。您将需要以某种方式存储自定义临时属性并使布局无效。因为您的自定义字形生成器将需要它们(见下文),所以您可能希望将临时属性存储在该对象中。

处理您的自定义属性将涉及替换不同的字形,因此我认为您需要使用自定义字形生成器。您可以将 NSGlyphGenerator 的自定义子类的实例传递给布局管理器的 glyphGenerator 属性的 setter。您的字形生成器需要将其自身插入标准实现及其字形存储对象(实际上是布局管理器,其角色为 NSGlyphStorage)。因此,您的子类也将采用 NSGlyphStorage 协议(protocol)。

您将重写唯一的字形生成器实例方法 -generateGlyphsForGlyphStorage:desiredNumberOfCharacters:glyphIndex:characterIndex:。当布局管理器调用您的字形生成器时,您对该方法的重写将调用 super,但会用 self 替换 glyphStorage 参数。不过,它必须记住实例变量中的原始glyphStorage

然后,父类(super class)的实现将调用对象上的 NSGlyphStorage 协议(protocol)中的各种方法。如果您希望您的实现不执行任何特殊操作,它只需调用原始的 glyphStorage 对象即可。但是,您需要检查自定义属性,并且对于存在该属性的任何运行,替换大写字母。这必须在 -attributedString 的实现中发生。您需要为原始 glyphStorage(布局管理器)返回的属性字符串创建一个可变副本,并且对于受自定义临时属性影响的任何范围,将字符替换为本地化的大写字母这些角色的版本。

您需要对此进行优化,这样您就不会不断地复制和修改作为布局管理器的文本存储的属性字符串(可能非常大)。不幸的是,布局管理器和字形生成器之间相当有限的接口(interface)不会让这变得容易。当文本存储发生更改时,文本存储将在布局管理器上调用 -textStorage:edited:range:changeInLength:invalidatedRange:,因此您可以利用它来使您可能拥有的任何缓存副本失效。

关于macos - 在 NSTextView 中以大写形式呈现一些文本,而不更改底层字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com