Как импульсная / инерционная прокрутка работает с Magic Mouse на NSScrollView?

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

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

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

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

3 ответа

Решение

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

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

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

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

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

Обратите внимание, что deviceDeltaX а также deviceDeltaY это частные методы NSEvent.

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

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AppleMomentumScrollSupported"];
 [defaults registerDefaults:appDefaults];

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

Другие вопросы по тегам