Использование действительно большого contentSize
- не лучший способ. contentSize
по-прежнему использует фиксированные типы данных, и если вы прокрутите достаточно долго, они переполнятся, и в лучшем случае ваш рисунок станет бесполезным. В худшем случае ваше приложение вылетает.
То, что вы хотите, это создать впечатление бесконечной прокрутки с помощью окна. Я проиллюстрирую, как это работает, на простом одномерном примере, но вы можете легко расширить его до двухмерного.
Допустим, у вас есть 3 записи, каждая из которых заполняет UIScrollView
. Прокручивая вправо, выглядело бы это так:
A B C A B C A B C ...
Внутренне, вы собираетесь расположить их так:
C A B C
Потому что, когда A видна, вы можете видеть часть C, если вы проводите вправо, или часть B, если вы проводите влево.
Ваши UIScrollView
contentOffset
- это ваше окно. В то время как contentSize
охватывает ширину всех четырех объектов (C A B C
), внутренне вы собираетесь ограничить это до 75% фактической ширины. Когда пользователь прокручивает влево и вправо, вы настраиваете contentOffset
так, чтобы оно никогда не было отрицательным или превышало 75% от contentSize.width
. Это делается внутри вашего делегата, в scrollViewDidScroll:
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
while (scrollView.contentOffset.x < 0)
scrollView.contentOffset.x += constrainedContentSize.width;
while (scrollView.contentOffset.x > constrainedContentSize.width)
scrollView.contentOffset.x -= constrainedContentSize.width;
// ...
}
Обратите внимание, что здесь предполагается наличие переменной экземпляра constrainedContentSize
, которая, вероятно, в контроллере для представления, что ваш UIScrollView
находится внутри, и что контроллер является вашим UIScrollView
делегатом.
Это будет гораздо эффективнее, чем постоянное освобождение и воссоздание представлений.