Как импульсная / инерционная прокрутка работает с Magic Mouse на NSScrollView? - PullRequest
3 голосов
/ 04 декабря 2009

Когда вы прокручиваете с помощью более новой Apple Magic Mouse (по крайней мере на 10.6, я не могу подтвердить ни одну предыдущую Mac OS), вы получаете инерционную прокрутку, как прокрутку на iPhone (то есть, после прокрутки пальцем, она не останавливается внезапно, а постепенно замедляется). Такое поведение "бесплатно" со всеми NSScrollViews, оно будет отображаться.

Существуют исключительные случаи, например Tweetie для Mac (я слышал, что Tweetie был написан с помощью пользовательского класса Table View, который работает подобно тому, как UITableView работает на iPhone).

Мой вопрос: как представления прокрутки знают, как сделать эту инерционную прокрутку? Я предполагаю, что мышь [драйвер] неоднократно отправляет события прокрутки с уменьшающейся величиной прокрутки (или что-то в этом роде) в течение периода прокрутки. Но я не совсем уверен, как это работает.

У меня есть некоторые проблемы с прокруткой в ​​моем классе scrollview, и я пытаюсь выяснить, почему (очевидно, у нас нет исходного кода для Tweetie, чтобы понять, почему он не получает надлежащую прокрутку), но просто пытаюсь чтобы лучше понять, как это работает, чтобы исправить мои собственные проблемы.

Ответы [ 3 ]

7 голосов
/ 05 декабря 2009

NSScrollView ничего не знает о Magic Mouse. Инерционная прокрутка выполняется повторяющимися событиями прокрутки.

Вы можете переопределить метод -scrollWheel: NSResponder и использовать NSLog, чтобы увидеть, как прокрутка Magic Mouse отличается от трекпада и традиционной прокрутки.

Традиционные наборы прокрутки deltaX и deltaY для указания количества «строк» ​​для прокрутки.

Устройства с плавной прокруткой (сенсорные панели и волшебная мышь) используют deviceDeltaX и deviceDeltaY для указания количества прокручиваемых пикселей.

Кроме того, Magic Mouse использует scrollPhase, чтобы указать, когда выполняется инерционная прокрутка.

Обратите внимание, что deviceDeltaX и deviceDeltaY являются закрытыми методами NSEvent.

1 голос
/ 04 мая 2010

, чтобы отказаться от импульса, добавьте @ "NO" для ключа @ "AppleMomentumScrollSupported" в самом начале вашего приложения по умолчанию для пользователя (см. Примечания к выпуску разработчика Magic Mouse). Таким образом, вы можете также переопределить его для Tweetie, добавив эту запись в настройки по умолчанию для твита.

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AppleMomentumScrollSupported"];
 [defaults registerDefaults:appDefaults];
0 голосов
/ 10 декабря 2011

Исходный код для TUIScrollView доступен здесь https://github.com/twitter/twui

...