【发布时间】:2023-04-08 17:56:01
【问题描述】:
我有一个文本编辑器应用程序,它使用 Markdown 样式格式。当插入符号/选择不在相应的行上时,格式字符被隐藏。
我成功地使用NSLayoutManagerDelegate 中的shouldGenerateGlyphs: 方法来操纵NSTextView 上绘制的内容。我使用的是纯委托,并且没有子类化布局管理器本身。
但是,我不明白如何在字形重新生成后正确定位插入符号。选择更改后,我正在调用一个方法(这里称为hideAndShowMarkup),它为当前编辑的行和之前选择的行重新生成字形。由于在屏幕上添加了一些字形,插入符号的渲染错误。
-(void)hideAndShowMarkup {
[self.layoutManager invalidateGlyphsForCharacterRange:currentLine.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager invalidateGlyphsForCharacterRange:prevLine.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager ensureGlyphsForCharacterRange:currentLine.range];
[self.layoutManager ensureGlyphsForCharacterRange:prevLine.range];
[self updateInsertionPointStateAndRestartTimer:YES];
}
updateInsertionPoint... 在这里不起作用,因为确保字形似乎异步运行。我也试过在didCompleteLayoutForTextContainer:委托方法中调用它,但没有效果。
有没有办法检测字形何时被实际绘制,并在此之后确保插入点的位置?
【问题讨论】:
-
不应该需要
invalidateGlyphsForCharacterRange和ensureGlyphsForCharacterRange之一。请张贴minimal reproducible example。 -
我通过浏览随机的 GitHub 存储库找到了一个解决方案,并将发布我的发现,因为有多个问题涉及相同的主题。
标签: objective-c macos cocoa appkit nstextview