我一直在努力解决这个问题。希望有人对iOS上的TextKit有所了解,可以帮助解释该过程,并指导我解决此问题。
在UITextView上启用拼写检查后,iOS会识别拼写错误,并在可疑单词下方添加红色虚线,然后可以利用这些单词提供替换建议。
我的应用程序使用带有自定义TextKit层和自定义NSTextStorage子类的UITextView进行语法突出显示。我的实现与拼写检查过程存在某种冲突。症状如下:
- 用户键入拼写错误的单词。
- iOS识别拼写错误,并添加红色虚线。
- 用户不断输入下一个单词,红色虚线消失。
- 该单词保留其“拼写错误”状态,因为它仍然可以被点击并提供替换建议,但是没有视觉上的迹象表明拼写问题。
以下是简短的YouTube视频,演示了这一操作:
之所以出现此问题,是因为我的语法突出显示实现必须扩展考虑的属性更改范围,因为键入的新字符可能会影响周围的属性。如果我不扩展范围并处理这些其他属性,则红色虚线仍会保留(但是我的语法突出显示无效!)。
我已经解决了这个问题很多,但是还没有找到文档,示例或红色虚线实现方式的细节,以弄清楚在NSTextStorage子类处理属性更新时如何保留它们。
在NSTextStorage子类中调用processEditing
时,在属性字符串上没有可以标识那些红色虚线的属性。
如果我在addAttributes
的NSTextStorage上调用setattributes
或processEditing
时,它似乎会踩在红色虚线上……尽管如此,但是替换建议是标记的遗骸。
那是什么问题?
真的,我希望能解释一下在文本呈现过程中,拼写检查器如何以及何时进行干预,以及如何对那些拼写错误的单词进行标记以得到红色虚线,以及在添加属性时如何避免挤压该标记支持语法突出显示。
可能有相关文档,但是我的Google-fu并没有产生任何帮助。
注释
这个相同的TextKit堆栈在macOS上没有相同的问题。这是特定于iOS的。