Некоторое время назад я играл с такой же проблемой и собрал небольшую демонстрацию одного решения. Не уверен, что проще или сложнее управлять видом карты, который может быть построен из множества плиток.
https://github.com/jonah-carbonfive/WrappingScrollView
Вот что я делаю на случай, если это не понятно из кода.
- Создайте одно представление, содержащее любой контент, который вы хотите отобразить. Мы назовем это «представлением плитки».
- Отображение вида плитки по центру в представлении содержимого UIScrollView. Сделайте представление содержимого значительно большим, чем представление мозаики (см. Ниже, чтобы узнать, насколько оно больше).
- Создание изображения содержимого вашего вида плитки.
- Создайте «плитки» UIImageView, содержащие это изображение, и расположите их вокруг представления плиток, чтобы заполнить представление содержимого представления прокрутки. Это может быть много UIImageViews, но они разделяют одно изображение, поэтому объем памяти не так уж и плох.
- Теперь у вас есть большой вид прокрутки, который, по-видимому, оборачивает его содержимое хотя бы один раз, но вы все равно попадете на край, если прокрутите достаточно далеко.
- В представлении прокрутки
-scrollViewDidScroll:
метод делегата проверьте, полностью ли прокрутилось представление вашего листа, если это так, переместите смещение содержимого представления прокрутки, чтобы изменить положение представления содержимого, чтобы представление листа вернулось в середину видимой области. , Если все сделано правильно, пользователь никогда не заметит, что вы перескочили с просмотра изображения мозаичного изображения обратно на само представление мозаичного изображения.
- Но подождите! Только центральный вид плитки будет реагировать на прикосновения. Все остальные его копии - всего лишь изображения. Мы можем обойти эту проблему, переопределив
-hitTest:withEvent:
, чтобы изменить положение мозаичного изображения, чтобы оно заняло место любого изображения, к которому пользователь пытается прикоснуться, прежде чем вызвать super
. Теперь все прикосновения достигают вида плитки.
- Обязательно обновляйте изображение вида плитки каждый раз, когда вид плитки перерисовывается.
Это что-то сумасшедшее, но оно позволяет мне бросать произвольные интерактивные UIViews и UIControls в контейнер и позволяет им сворачивать одну сторону и обратно в другую.
Честно говоря, это, вероятно, не очень хорошее решение для вас. Если бы я знал, что хочу нарисовать карту, которая может обернуться одним или несколькими измерениями, я бы разбил карту на множество плиток. Обнаружение касаний в некотором представлении контейнера во многом аналогично UIScrollView и изменение положения плиток, когда пользователь перемещает их касания. Удаление плиток, когда они прокручиваются из поля зрения, и их повторное использование для отображения новых видимых областей карты.
В простом случае вы можете реализовать это, используя всего две копии изображения карты. В сложном случае вы воссоздаете большую часть UIScrollView; масштабирование отображаемых плиток и, возможно, загрузка разных наборов плиток с различным разрешением, чтобы уменьшить использование памяти и увеличить разрешение при масштабировании.