Инерционная прокрутка и колесо прокрутки: в OS X - PullRequest
4 голосов
/ 28 мая 2011

ПРОБЛЕМА:

У меня есть NSScrollView. Я использую его для реализации собственного «табличного представления» со строками данных, которые на самом деле являются NSViews. (Примечание: это не экземпляр NSTableView.)

Когда я выполняю вертикальную прокрутку (горизонтальная прокрутка отсутствует), я использую уведомление boundsChanged для добавления (в качестве подпредставлений содержимого view scrollView) видимых NSView (объектов с фреймами, которые пересекают видимый прямоугольник документа scrollView) и для удалите те, которые больше не видимы (кадры вне видимого прямоугольника scrollView.)

Процесс работает прекрасно, за исключением случаев, когда речь идет об инерционной прокрутке. Если я наведу курсор на ячейку X и щелкну трекпадом, чтобы прокрутить вниз БЫСТРО с инерцией, ячейка X быстро покинет видимый прямоугольник и, как таковая, будет удалена из contentView scrollView. НО, это убивает инерционную прокрутку. Если я НЕ удаляю ячейку X как подпункт, тогда инерционная прокрутка работает отлично.

ЧТО МНЕ НУЖНО:

Способ сохранить инерционную прокрутку, все еще удаляя NSView, над которым курсор оказался, когда пользователь запустил жест прокрутки.

ЧТО Я ПРОБОВАЛ:

Я посмотрел на метод NSResponder:

-scrollWheel:(NSEvent *)theEvent 

Реализация по умолчанию передает scrollWheel следующему респонденту. Итак, я создал подкласс NSScrollView и реализовал этот метод, чтобы попытаться не дать ему передать событие scrollWheel отдельным подпунктам внутри представления содержимого scrollView. Не сработало

Итак, я вошел в свои NSView (те, которые я добавляю в contentView) и переопределил scrollWheel, чтобы передать событие обратно в сам scrollView. Не сработало

Я все еще получаю прокрутку в обоих случаях, но не с инерцией.

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 15 августа 2011

Я не сделал этого точно в Какао, но я, вероятно, подумал бы о простой переработке вашего объекта NSView, как только он выйдет из видимого прямоугольника, удалив его подпредставлений, затем изменив его рамка должна быть на месте для прокрутки назад на видимый прямоугольник сверху.

Очевидно, что это можно сделать, просто обновив его фрейм и избегая необходимости удалять и повторно добавлять его в NSScrollView.

...