NSTextView并确定字形位置

问题描述 投票:0回答:1

我试图为某些行定义y轴位置,并在NSTextView中在它们旁边贴上标签。我正在使用glyphRangeForCharacterRange。

它有点工作,但是文本视图可以有很多文本(甚至~4000-5000行)并且用insets包装。当我滚动到不可见的东西时,结果是错误的。似乎没有包装就返回值,或者我认为。如果我在滚动到相应文本时对位置进行更新,则会正确计算它们。

这是没有附加偏移量的代码:

NSRange characterRange = NSMakeRange(startPosition, length);
NSRange range = [[self.textView layoutManager] glyphRangeForCharacterRange:characterRange actualCharacterRange:nil];
label.frame = rect;

NSRect rect = [[self.textView layoutManager] boundingRectForGlyphRange:range inTextContainer:[self.textView textContainer]];

如果我尝试在文档唤醒后设置标签位置会出现同样的问题,所以我在第一次按键时计算标签,这不太好。

围绕这个最好的方法是什么?

objective-c cocoa nstextview nslayoutmanager
1个回答
0
投票

我发现了一个有点合理的解决方案。只需在滚动视图中发布边界已更改的通知。

 [[self.textScrollView contentView] setPostsBoundsChangedNotifications:YES];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boundsDidChange:) name:NSViewBoundsDidChangeNotification object:[self.textScrollView contentView]];

然后只需进行更新,并考虑文本视图的新渲染部分。

 - (void)boundsDidChange:(NSNotification*)notification {
    [self updateLabels];
 }

更新方法不应该太复杂或太重,因为它显然是在每个滚动帧上完成的。

© www.soinside.com 2019 - 2024. All rights reserved.