NSLayoutManager возвращает неправильный glyphIndex для mousePosition в NSTextView - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть 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 илислишком высоко, таким образом, выбирая неправильный глиф.Мое текстовое представление содержит только символы с одним пробелом, поэтому смещение не вызывается дополнительными символами.

Интересно, что если я сверну левую панель (в коде или в раскадровке), я получу правильный индекс.Но смещение в направлении x больше ширины левой панели.

Чего мне здесь не хватает, есть ли ошибка в приведенном выше коде?

1 Ответ

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

Основываясь на комментарии @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 за указание на это.

...