首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSLayoutManager字形生成与插入位置

NSLayoutManager字形生成与插入位置
EN

Stack Overflow用户
提问于 2021-09-30 21:04:10
回答 1查看 131关注 0票数 0

我有一个文本编辑器应用程序,它使用Markdown风格的格式。当插入符号/选择不在对应行上时,格式字符将被隐藏。

我在NSLayoutManagerDelegate中成功地使用了NSLayoutManagerDelegate方法来操作在NSTextView上绘制的内容。我使用的是纯委托,没有对布局管理器本身进行子类化。

然而,我不知道我如何能够正确定位符号后,字形再生。在选择更改后,我将调用一个方法(这里称为hideAndShowMarkup),该方法为当前编辑的行和前面选择的行重新生成符号。因为在屏幕上添加了一些象形文字,所以插入符号呈现错误。

代码语言:javascript
复制
-(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:委托方法中调用它,但是没有效果。

是否有一种方法来检测何时真正绘制了象形文字,并确保插入点的位置之后?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-02 10:23:42

令人惊讶的是,NSLayoutManager文档很少,理解它的内部工作需要在随机的公共存储库中查看实现。

若要更改范围内的象形文字并使插入符号位置正确,您首先需要使两个更改范围的象形文字失效,然后对插入符号即将定位的区域,使布局失效。

然后,在确保存在当前图形上下文之后,可以同步重新绘制象形文字。之后,更新插入点正常工作。

在下面的示例中,我有两个对象,lineprevLine,它们包含插入符号现在所处的行的范围,以及一个插入符号移开的范围。

代码语言:javascript
复制
-(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];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69398805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档