我有一个文本编辑器应用程序,它使用Markdown风格的格式。当插入符号/选择不在对应行上时,格式字符将被隐藏。
我在NSLayoutManagerDelegate中成功地使用了NSLayoutManagerDelegate方法来操作在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:委托方法中调用它,但是没有效果。
是否有一种方法来检测何时真正绘制了象形文字,并确保插入点的位置之后?
发布于 2021-10-02 10:23:42
令人惊讶的是,NSLayoutManager文档很少,理解它的内部工作需要在随机的公共存储库中查看实现。
若要更改范围内的象形文字并使插入符号位置正确,您首先需要使两个更改范围的象形文字失效,然后对插入符号即将定位的区域,使布局失效。
然后,在确保存在当前图形上下文之后,可以同步重新绘制象形文字。之后,更新插入点正常工作。
在下面的示例中,我有两个对象,line和prevLine,它们包含插入符号现在所处的行的范围,以及一个插入符号移开的范围。
-(void)hideAndShowMarkup {
[self.layoutManager invalidateGlyphsForCharacterRange:line.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager invalidateGlyphsForCharacterRange:prevLine.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager invalidateLayoutForCharacterRange:line.range actualCharacterRange:nil];
if (NSGraphicsContext.currentContext) {
[self.layoutManager drawGlyphsForGlyphRange:line.range atPoint:self.frame.origin];
[self.layoutManager drawGlyphsForGlyphRange:prevLine.range atPoint:self.frame.origin];
}
[self updateInsertionPointStateAndRestartTimer:NO];
}https://stackoverflow.com/questions/69398805
复制相似问题