Вопрос

К сожалению, мне сложно проверить себя, потому что у меня еще нет собственной Magic Mouse, но мои тестировщики, у которых есть Magic Mouse, сказали мне, что импульсная прокрутка не работает в моем приложении.Я не создал подкласс NSScrollView, но представление документа в Scrollview полностью настраиваемое.Я не переопределил колесо прокрутки:где угодно, но, тем не менее, импульс, очевидно, просто не работает.Я даже не знаю, с чего начать.Я думал, что он просто отправит события ScrollWheel, и все позаботится само о себе.(Прокрутка с помощью колесика или трекпада MBP работает так, как и ожидалось.) Очевидно, я должен каким-то образом делать что-то, что останавливает ее, но я даже не знаю, с чего начать.Мысли?

Это было полезно?

Решение

Я понял это некоторое время назад, и проблема заключалась в том, что при прокрутке я выполнял много причудливых манипуляций с представлениями, что-то вроде того, как на iPhone UITableView добавляет и удаляет представления при их прокрутке на экране и за его пределами.Это отлично сказалось на производительности, но чем больше я углублялся в программирование для OSX, тем больше понимал, что для OSX это неправильно (но для iPhone это правильная идея).

В любом случае, похоже, что на самом деле происходит то, что когда вы делаете что-то вроде прокрутки колеса, событие прокрутки отправляется в представление, которое находится под курсором мыши, а затем оно распространяется по респондентам/представлениям, пока не попадет куда-нибудь, которое его обрабатывает. .Обычно это не проблема, но при прокрутке по импульсу ОС на самом деле просто отправляет все меньшие события ScrollWheel в представление, которое находилось под курсором. в то время, когда начался импульс.Это означает, что если представление удаляется во время прокрутки (поскольку оно прокручивается за пределы экрана или что-то в этом роде), это разрывает цепочку, и импульс прекращается, потому что представление, которое все еще получает сообщения ScrollWheel, больше не находится в иерархии представлений.

«Простое» исправление состоит в том, чтобы не удалять представление, получившее последнее событие ScrollWheel, даже если оно находится за пределами экрана.Лучшее решение (и то, которое я выбрал) — не пытаться использовать NSViews, как будто они UIViews, а вместо этого просто рисовать контент с помощью drawRect.:) Мало того, что это примерно в миллиард раз быстрее, это просто работает (тм) с импульсной прокруткой, потому что OSX ожидает, что все будет сделано.

Повторяй за мной:OSX - это не iPhoneOS..:П

Другие советы

Странное поведение прокрутки может возникнуть, если вы не установили свойства Line Scroll и Page Scroll самого NSScrollView.

Кроме того, вам просто понадобится Magic Mouse - легко сказать или нет :-) - чтобы протестировать это самостоятельно или опубликовать весь код вашего пользовательского представления, а также содержащий его xib.Без него другие люди не смогут предложить вам ничего, кроме догадок (как указано выше).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top