NSLayoutManager возвращает неправильный glyphIndex для mousePosition в NSTextView
У меня есть NSTextView
подкласс как правильный элемент в NSSplitViewController
левая панель NSOutlineView
, Чтобы обрабатывать щелчки мыши, пока командная клавиша нажата в текстовом представлении, я добавил следующее, чтобы найти глиф, который находится под мышью:
override func mouseDown(with event: NSEvent) {
guard
let lm = self.layoutManager,
let tc = self.textContainer
else { return }
let localMousePosition = convert(event.locationInWindow, to: nil)
var partial = CGFloat(1.0)
let glyphIndex = lm.glyphIndex(for: localMousePosition, in: tc, fractionOfDistanceThroughGlyph: &partial)
print(glyphIndex)
}
Тем не менее, это приводит к тому, что индекс примерно на 10 или около того слишком высок, что приводит к неправильному выбору глифа. Мое текстовое представление содержит только символы с одним пробелом, поэтому смещение не вызывается дополнительными глифами.
Интересно, что если я сверну левую панель (в коде или в раскадровке), я получу правильный индекс. Но смещение в направлении х больше ширины левой панели.
Чего мне здесь не хватает, есть ли ошибка в коде выше?
1 ответ
Основываясь на комментарии @Willeke выше, я сделал следующее изменение в своем коде:
localMousePosition = convert(event.locationInWindow, from: nil)
if enclosingScrollView?.frame.width == window?.frame.width {
// left panel is collapsed, so use convert: to:
localMousePosition = convert(event.locationInWindow, to: nil)
}
Кажется, работает.
Проблема заключалась в том, что я использовал localMousePosition = convert(event.locationInWindow, to: nil)
в mouseMoved
также (localMousePosition
это свойство вида). Меняя это на localMousePosition = convert(event.locationInWindow, from: nil)
заставил все это работать. Еще раз спасибо @Willeke за указание на это.