NSTextView и определение положения глифа - PullRequest
0 голосов
/ 22 февраля 2019

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

0 голосов
/ 22 февраля 2019

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

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

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

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

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

...