我试图为某些线定义y轴位置,并在NSTextView中在它们旁边添加标签。我正在使用glyphRangeForCharacterRange。
这是可行的,但是文本视图可以包含很多文本(甚至〜4000-5000行),并用插图包裹。当我滚动到看不见的东西时,结果是错误的。似乎返回值而没有换行,所以我想。如果在滚动到相应的文本时更新位置,则会正确计算它们。
这是没有其他偏移量的代码:
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]];
如果在文档唤醒后尝试设置标签位置,则会发生相同的问题,因此我在第一次按键时就计算了标签。
解决这个问题的最佳方法是什么?
答案 0 :(得分: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];
}
更新方法不应太复杂或繁琐,因为它显然在滚动的每一帧中都已完成。