我试图为某些行定义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]];
如果我尝试在文档唤醒后设置标签位置会出现同样的问题,所以我在第一次按键时计算标签,这不太好。
围绕这个最好的方法是什么?
我发现了一个有点合理的解决方案。只需在滚动视图中发布边界已更改的通知。
[[self.textScrollView contentView] setPostsBoundsChangedNotifications:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boundsDidChange:) name:NSViewBoundsDidChangeNotification object:[self.textScrollView contentView]];
然后只需进行更新,并考虑文本视图的新渲染部分。
- (void)boundsDidChange:(NSNotification*)notification {
[self updateLabels];
}
更新方法不应该太复杂或太重,因为它显然是在每个滚动帧上完成的。