2015-07-02 4 views
1

У меня возникает странная ошибка, когда я перезаписываю функцию scrollWheel (theEvent: NSEvent) в NSScrollView.Прокрутка в NSScrollView останавливается при перезаписи функции прокруткиWheel

Вот мой код:

import Cocoa 

class GraphScrollView: NSScrollView { 
    var axisScrollViewInstance: AxisScrollView? 

    override func scrollWheel(theEvent: NSEvent) { 
     if theEvent.deltaY != 0 { 
      axisScrollViewInstance?.scrollEventFromOtherScrollView(theEvent) 
      super.scrollWheel(theEvent) 
     } else if theEvent.deltaX != 0 { 
      super.scrollWheel(theEvent) 
     } 
    } 
} 

class AxisScrollView: NSScrollView { 
    var graphScrollViewInstance: GraphScrollView? 
    override func scrollWheel(theEvent: NSEvent) { 
     if theEvent.deltaY != 0 { 
      super.scrollWheel(theEvent) 
      graphScrollViewInstance?.scrollWheel(theEvent) 
     } 
    } 

    func scrollEventFromOtherScrollView(theEvent: NSEvent) { 
     if theEvent.deltaY != 0 { 
      super.scrollWheel(theEvent) 
     } 
    } 
} 

Код в основном проверяет, в каком направлении пользователь прокручивает и передает NSEvent другому NSScrollView если направление вертикально. Мне нужно это, чтобы у меня было два NSScrollViews рядом друг с другом, которые прокручиваются по вертикали, а один из них также прокручивается по горизонтали. В качестве примера вы можете посмотреть приложение Mac Calendar, в котором есть часовой столбец слева, который только прокручивает по вертикали и обзор в неделю справа, который прокручивает по горизонтали и по вертикали.

Однако, если я перезаписываю метод scrollWheel и вызываю суперфункцию изнутри, это приводит к странной проблеме с Mighty Mouse. Я могу только прокручивать вверх и вправо, в то время как он ничего не делает, если я прокручиваю в любом другом направлении, хотя NSEvent всегда происходит, не обращая внимания на то, в каком направлении я прокручиваю. Через некоторое время она перестает прокручиваться.

Я уже пытался просто переписать ScrollWheel-метод и вызывать только супер функцию с событием, как это:

override func scrollWheel(theEvent: NSEvent) { 
    super.scrollWheel(theEvent) 
} 

, но это приводит к тем же проблемам. У меня есть вторая (не Apple) мышь, подключенная к моей системе, которая имеет «нормальное» колесо прокрутки и с которым мой код работает отлично.

У вас есть идея, в чем проблема? Я слышал, что NSEvents имеют другой подтип (1: Apple Device, 0: Any other Device). Может быть, это как-то связано с этим? В противном случае, знаете ли вы, как я могу иметь два NSScrollViews рядом друг с другом, которые прокручивают вертикально одновременно?

ответ

0

Хорошо, так что это ошибка с интерфейсом Builder в Xcode 6.4 и, возможно, в ранних версиях. Вы должны убедиться, что флажок «Показать вертикальный скроллер» и «Показать горизонтальный скроллер» в Инспекторе атрибутов NSScrollView отмечены.

How the attribute inspector should look like

Если оба флажка у вас не будет проблем с перезаписью ScrollWheel (theEvent: NSEvent) функцию. Затем вы можете без проблем удалить программные полосы прокрутки, установив hasHorizontalScroller и hasVerticalScroller на значение false, например. ваш инициализационная()


Update на 12.10.2015
Я сообщил об «ошибке» в Apple, однако, кажется, что, переписав функцию -scrollWheel, вид теряет отзывчивой прокрутку способности.

Это ответ на Dev Team Apple:

  1. Если переопределить -scrollWheel, то, что Scrollview не может выполнить responsiveScrolling.
  2. Если критическая прокрутка не включена, прокрутка должна быть показана для прокрутки прокрутки.
  3. См документации для +isCompatibleWithResponsiveScrolling

В документации сказано:

по умолчанию реализация этого метода возвращает истину, если класс не переопределяет lockFocus или ScrollWheel: метод

 Смежные вопросы

  • Нет связанных вопросов^_^