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

StackOverflow https://stackoverflow.com/questions/1849023

Вопрос

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

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

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

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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