NSTextView и определение положения глифа

Я пытаюсь определить положение оси 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]];

Та же проблема возникает, если я пытаюсь установить позиции меток после пробуждения документа, поэтому я вычисляю метки при первом нажатии, что не слишком приятно.

Что было бы лучшим способом обойти это?

1 ответ

Я нашел несколько правдоподобное решение. Просто опубликуйте уведомление из прокрутки, что границы изменились.

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

Затем просто выполните обновление, и вновь отображенная часть текстового представления будет учтена.

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

Метод обновления не должен быть слишком сложным или тяжелым, поскольку он, очевидно, делается для каждого кадра прокрутки.

Другие вопросы по тегам