NSTextView внутри NSScrollView не взаимодействует при прокрутке - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть TableView, который имеет NSTextView в качестве ячеек.это ситуация, когда у меня есть scrollView внутри scrollView.Теперь, когда я прокручиваю содержимое textView, и когда содержимое textview достигает конца, я хочу, чтобы родительский scrollView (tableView) продолжил прокрутку.Но по умолчанию этого не происходит.Вместо этого родительский элемент вообще не прокручивается, когда указатель мыши находится внутри textView.

Я хочу добиться чего-то похожего в этом примере.

Это мое решение:

public class DisableableScrollView: NSScrollView {

public override func scrollWheel(with event: NSEvent) {

    // Check if the text field is empty
    if (self.subviews[0].subviews[2] as! NSTextView).textStorage?.length == 0 {
        nextResponder?.scrollWheel(with: event)
    }
    // Bottom
    else if self.verticalScroller?.floatValue == 1.00  {
        if event.deltaY < 0 {
            nextResponder?.scrollWheel(with: event)
        }
        else {
            super.scrollWheel(with: event)
        }
    }
    // Top
    else if self.verticalScroller?.floatValue == 0.00  {
        if event.deltaY > 0 {
            nextResponder?.scrollWheel(with: event)
        }
        else {
            super.scrollWheel(with: event)
        }
    }

    else {
        super.scrollWheel(with: event)
    }
}

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

Здесь проблема заключается вВолшебная мышьЕсли я использую обычную могучую мышь, все работает нормально.Но с помощью волшебной мыши, когда я поднимаю палец после прокрутки, она продолжает прокручиваться (импульс прокрутки), но иногда прокручивает неправильный экземпляр textView.Согласно Документация Apple , для события прокрутки есть два свойства: phase и momentumPhase.С волшебной мышью после того, как я поднял палец, фаза становится завершенной, а импульс импульса начинается.

Кто-нибудь знает стандартное решение этой проблемы?Или, если мой код правильный, что может быть не так?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

Этот конкретный метод wantForwardedScrollEvents (for:) можно использовать для пересылки событий прокрутки вверх по цепочке респондента всякий раз, когдасодержание достигло конца.Нам просто нужно переопределить этот метод и вернуть true , где это необходимо.

0 голосов
/ 30 ноября 2018

С Правила Apple :

Не размещайте вид прокрутки внутри другого вида прокрутки.Это создает непредсказуемый интерфейс, которым сложно управлять.

Как правило, отображать по одному представлению прокрутки за раз.Люди часто делают большие жесты при прокрутке, и может быть трудно избежать взаимодействия с соседним видом прокрутки на одном экране.Если вам нужно разместить два вида прокрутки на одном экране, рассмотрите возможность их прокрутки в разных направлениях, чтобы один жест менее влиял на оба вида.Например, когда iPhone находится в портретной ориентации, приложение «Акции» отображает котировки акций, которые прокручиваются вертикально над информацией о компании, которая прокручивается горизонтально.

Вам следует переосмыслить свой дизайн.

...