UITableView с пейджингом и импульсом

НАБЛЮДЕНИЯ

Я обнаружил некоторые "странные" вещи о том, как UITableViews / UIScrollViews прокручиваются в Objective-C для iOS после того, как вы подняли палец:

  • "Скорость" представления прокрутки (как в scrollViewWillEndDragging:withVelocity:targetContentOffset:) основан не на времени, а на "рендеринге", "обновлении кадра" и т. п.; т. е. "скорость" 3,0 означает, что представление прокрутки будет прокручивать 3,0 пункта до следующего обновления, в этот момент оно будет прокручивать еще 3,0 пункта, если "скорость" все еще равна 3,0. (в отличие от абсолютной скорости, основанной на времени)

  • "Обновления" происходят ок. 950 раз в секунду, но это варьируется и не является надежным. (опять же, в отличие от абсолютной частоты обновления по времени)

  • Поскольку UIScrollViews замедляются экспоненциально, а не линейно, decelerationRate является геометрической постоянной Это означает, что при каждом "обновлении" вида прокрутки его "скорость" устанавливается равной предыдущей скорости, умноженной на "скорость замедления".

  • В какой-то момент скорость представления прокрутки достаточно близка к нулю, чтобы остановить прокрутку. Я не уверен, что это за порог.


ЖЕЛАЕМОЕ ПОВЕДЕНИЕ / ПРОБЛЕМА

Я вывел уравнение, которое теоретически можно решить, чтобы скорректировать скорость замедления, чтобы представление прокрутки могло прокручиваться естественным образом с импульсом и располагаться достаточно близко к верхней части ячейки табличного представления, чтобы имитировать "разбиение по страницам". (У меня также есть анимация, добавленная к scrollViewDidEndDragging:willDecelerate: минимально корректировать смещение контента. Регулировка смещения контента без регулировки. DecelerationRate выглядит странно; представление прокрутки или прыгает вперед или внезапно отклоняется назад.)

Это уравнение: Ad ^ n + B d + C = 0, где d = decelerationRate, В идеале я хотел бы что-то в форме d (n, A, B, C), но мой друг по математике сказал мне, что это невозможно детерминистически. Он указал мне на следующую страницу: http://en.wikipedia.org/wiki/Root-finding_algorithm

Я также обнаружил, что не могу анимировать представление прокрутки с заданным смещением содержимого, используя стиль анимации UIViewAnimationCurveEaseOut так как setContentOffset:animated: не берет options: параметр. В противном случае я бы "фальсифицировал" прокрутку до смещения моего предварительно рассчитанного содержимого.

(Я нашел это на SO, но у меня это не сработало: UIScrollview setContentOffset с нелинейной анимацией?)

Я хотел бы использовать табличное представление, потому что все мои элементы в моем представлении прокрутки будут по существу ячейками, и табличные представления лучше всего подходят для отображения списка ячеек. Однако, из-за моих трудностей с получением желаемого поведения, я мог бы просто сделать просмотр прокрутки, что, вероятно, будет проще. Затем я могу просто ограничить количество "ячеек", видимых в моем настраиваемом "представлении таблицы", или загрузить их по мере необходимости.


Каковы ваши идеи / мысли / предложения?

До сих пор я не нашел существующих примеров того, что мне хотелось бы.


ИЛЛЮСТРАЦИИ

Пример 1 ИЛИ ЖЕ Пример 2

1 ответ

Решение

Так что этот ответ был получен через язвительного, но блестящего пользователя на IRC-канале #iphonedev!

Изнутри scrollViewWillEndDragging:withVelocity:targetContentOffset: вы можете просто переустановить targetContentOffset на все, что вы хотите через *targetContentOffset = newTargetOffset;! Невероятно просто и элегантно.

Моя ошибка была попытка позвонить [scrollview setContentOffset:newTargetOffset animated:YES] изнутри scrollViewWillEndDragging:withVelocity:targetContentOffset:что не сработало совсем, и поэтому я решил "решить" мою проблему более замысловатым образом, что тоже не сработало вообще.

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