NSTextView внутри NSScrollView не работает при прокрутке

У меня есть 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. С помощью волшебной мыши после того, как я поднимаю палец вверх, фаза становится Завершенной, а momentumPhase становится Начальной.

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


person Faizyy    schedule 30.11.2018    source источник


Ответы (2)


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

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

person Faizyy    schedule 18.12.2018

Из рекомендаций Apple:

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

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

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

person Prettygeek    schedule 30.11.2018
comment
Вот версия для macOS: Прокрутка просмотров. В нем говорится, что не помещайте вид прокрутки в другой вид прокрутки. Вложенные полосы прокрутки создают непредсказуемый интерфейс, которым сложно управлять. - person Willeke; 01.12.2018
comment
Я видел эту реализацию в собственных приложениях Apple, таких как Radar. Но я не знаю, что это реализовано в коде. - person Faizyy; 03.12.2018