Прогнозирование смещения покоя в UIScrollView после замедления - PullRequest
25 голосов
/ 30 октября 2009

Я хотел бы иметь возможность предсказать окончательное смещение покоя в UIScrollView после жеста щелчка. Он не должен быть точным по пикселям, но достаточно близким, чтобы пользователь не воспринимал разницу (то есть он не двигался чрезмерно меньше или больше, чем он привык).

Я знаю, что кто-то спросит, поэтому: почему? У меня есть элемент управления в виде таблицы в UIScrollView. Я хотел бы сделать так, чтобы самый верхний элемент меню полностью отображался и располагался в верхней части UIScrollView. Функция подкачки UIScrollView не совсем то, что я хочу, потому что сильный щелчок не пролетает кратные границы представления.

Обработка событий обычного касания достаточно проста. На touchesEnded:withEvent: я могу прокрутить до ближайшего полного пункта меню. Тяжелая часть - замедление.

Есть две константы для скорости замедления, UIScrollViewDecelerationRateNormal и UIScrollViewDecelerationRateFast. Их значения 0,998 и 0,990 в iPhone OS 3.0. Я пытался выяснить математику, которую Apple использует для замедления движения, но я выхожу пустой.

Если я могу с некоторой точностью предсказать окончательное смещение покоя, то в начале замедления я могу просто использовать scrollRectToVisible:animated:, чтобы перейти к смещению, когда пункт меню находится вровень с верхней частью границ вида.

Знают ли какие-нибудь склонные к математике люди, что Apple может делать во время замедления? Должен ли я собрать несколько чисел событий замедления, построить их график и придумать что-нибудь близкое?

Ответы [ 3 ]

15 голосов
/ 08 ноября 2011

Контроль targetContentOffset UIScrollView в iOS 5

iOS5 UIScrollViewDelegate имеет новый метод: scrollViewWillEndDragging:withVelocity:targetContentOffset:.

Это идеально соответствует тому, что вы хотите сделать.

Этот метод не вызывается, когда значение представления прокрутки Свойство pagingEnabled имеет значение YES. Ваше приложение может изменить значение параметра targetContentOffset для настройки места прокрутки завершает анимацию прокрутки.

Альтернативное решение для iOS4 и ниже

Измените UIScrollView decelerationRate на UIScrollViewDecelerationFast, а затем в scrollViewDidEndDecelerating перейдите к ближайшая "страница".

Быстрое замедление делает полную остановку / скольжение чуть более естественным / менее неприятным.

3 голосов
/ 18 января 2011

Вы можете наблюдать скорость прокрутки, когда UIScrollView замедляется, а когда скорость падает ниже определенного значения, привязка к ближайшему пункту меню.

Вероятно, вы захотите реализовать методы UIScrollViewDelegate scrollViewDidEndDragging:willDecelerate: и scrollViewDidScroll:. Когда пользователь поднимает палец, чтобы завершить жест прокрутки, будет вызван scrollViewDidEndDragging:willDecelerate:. Начните следить за событиями scrollViewDidScroll: и наблюдайте дельту между текущей позицией UIScrollView и ее предыдущей позицией, деленную на дельту времени:

float velocity = (currentPosition - lastPosition) / (currentTime - lastTime);

Когда скорость падает ниже минимального значения, звоните scrollRectToVisible:animated: на UIScrollView.

0 голосов
/ 26 сентября 2012

Я не могу комментировать (думаю, мне нужно 50 повторений), так что это не полный ответ, но, учитывая значения 0,998 и 0,990 для замедления, мои инстинкты заключаются в том, что они просто умножают текущую скорость на скорость замедления в каждом кадре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...