Цикл UIScrollView по горизонтали - PullRequest
2 голосов
/ 13 января 2011

Я хочу зациклить UIScrollView, но не так, как это делает большинство циклов в списке представлений, только то, которое прокручивает одно подпредставление, но плавно повторяется.

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

кто-нибудь получил какие-нибудь советы?

1 Ответ

4 голосов
/ 13 января 2011

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

https://github.com/jonah-carbonfive/WrappingScrollView

Вот что я делаю на случай, если это не понятно из кода.

  1. Создайте одно представление, содержащее любой контент, который вы хотите отобразить. Мы назовем это «представлением плитки».
  2. Отображение вида плитки по центру в представлении содержимого UIScrollView. Сделайте представление содержимого значительно большим, чем представление мозаики (см. Ниже, чтобы узнать, насколько оно больше).
  3. Создание изображения содержимого вашего вида плитки.
  4. Создайте «плитки» UIImageView, содержащие это изображение, и расположите их вокруг представления плиток, чтобы заполнить представление содержимого представления прокрутки. Это может быть много UIImageViews, но они разделяют одно изображение, поэтому объем памяти не так уж и плох.
  5. Теперь у вас есть большой вид прокрутки, который, по-видимому, оборачивает его содержимое хотя бы один раз, но вы все равно попадете на край, если прокрутите достаточно далеко.
  6. В представлении прокрутки -scrollViewDidScroll: метод делегата проверьте, полностью ли прокрутилось представление вашего листа, если это так, переместите смещение содержимого представления прокрутки, чтобы изменить положение представления содержимого, чтобы представление листа вернулось в середину видимой области. , Если все сделано правильно, пользователь никогда не заметит, что вы перескочили с просмотра изображения мозаичного изображения обратно на само представление мозаичного изображения.
  7. Но подождите! Только центральный вид плитки будет реагировать на прикосновения. Все остальные его копии - всего лишь изображения. Мы можем обойти эту проблему, переопределив -hitTest:withEvent:, чтобы изменить положение мозаичного изображения, чтобы оно заняло место любого изображения, к которому пользователь пытается прикоснуться, прежде чем вызвать super. Теперь все прикосновения достигают вида плитки.
  8. Обязательно обновляйте изображение вида плитки каждый раз, когда вид плитки перерисовывается.

Это что-то сумасшедшее, но оно позволяет мне бросать произвольные интерактивные UIViews и UIControls в контейнер и позволяет им сворачивать одну сторону и обратно в другую.


Честно говоря, это, вероятно, не очень хорошее решение для вас. Если бы я знал, что хочу нарисовать карту, которая может обернуться одним или несколькими измерениями, я бы разбил карту на множество плиток. Обнаружение касаний в некотором представлении контейнера во многом аналогично UIScrollView и изменение положения плиток, когда пользователь перемещает их касания. Удаление плиток, когда они прокручиваются из поля зрения, и их повторное использование для отображения новых видимых областей карты. В простом случае вы можете реализовать это, используя всего две копии изображения карты. В сложном случае вы воссоздаете большую часть UIScrollView; масштабирование отображаемых плиток и, возможно, загрузка разных наборов плиток с различным разрешением, чтобы уменьшить использование памяти и увеличить разрешение при масштабировании.

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