среда, 7 марта 2012 г.

Бесконечный UIScrollView

Вчера натолкнулся на интересное кино от Apple. Называется advanced-scrollview-techniques. Первая часть (Infinite scrolling) посвящена бесконечной прокрутке IUScrollView. Для тех, кому лень смотреть (или просто проблемы с английским), вкратце расскажу идею. Для простоты рассмотрим случай горизонтального скроллинга. Если кому понадобится еще и вертикальный, допилить будет несложно.
  1. Наследуемся от UIScrollView и задаем contentSize раз в 5 шире самого view (в примере 5000). Высота содержимого не слишком принципиальна, пусть будет равна высоте вьюхи.
  2. Выставляем contentOffset так, чтобы середина контента приходилась на середину view.
  3. Перегружаем layoutSubviews следующим образом:
  • смотрим на contentOffset и выясняем на сколько он сместился от первоначального положения (середины)
  • переносим contentOffset обратно. Если в результате скролла он сместился влево, значит двигаем его вправо. Ну, и наоборот.
  • смещаем все subview на то же расстояние в ту же сторону. Только не используйте при этом свойство UIView subviews. Дочерние вьюхи лучше хранить в отдельном массиве потому, что скролл-индикаторы - это тоже subviews.
Фокус основан на том, что если в разогнанном UIScrollView изменить свойство contentOffset, это никак не скажется на скорости скроллинга и пользователь ничего не заметит.
Ну и, конечно, не забывайте удалять view, которые уже вышли из области видимости. Память-то на iPhone не бесконечная :)

Пример можно посмотреть в документации Apple.