水平循环UIScrollView

时间:2011-01-13 02:31:18

标签: iphone loops uiscrollview

我希望循环一个UIScrollView,但不是大多数循环浏览视图列表的方式,只是一个滚动浏览一个子视图,但是无缝循环。

基本上,我正在尝试制作一个地图视图,我可以放大和缩小,并继续滚动。

任何人都有任何提示?

1 个答案:

答案 0 :(得分:4)

前一段时间我正在玩同样的问题,并且一起攻击了一个解决方案的快速演示。我不确定地图视图是否会更容易或更难管理。

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

以下是我正在做的事情,以防代码中不清楚。

  1. 创建包含您要显示的内容的单个视图。我们称之为“平铺视图”。
  2. 以UIScrollView的内容视图显示您的磁贴视图。使内容视图明显大于平铺视图(请参阅下面的大小)。
  3. 创建平铺视图内容的图像。
  4. 创建包含此图像的UIImageView“图块”并将其放置在图块视图周围以填充滚动视图的内容视图。这可能是很多UIImageViews,但它们共享一个图像,因此内存占用空间也不算太差。
  5. 现在你有一个大的滚动视图,它看起来至少包裹了一次内容,但如果滚动得足够远,你仍然会碰到边缘。
  6. 在滚动视图的-scrollViewDidScroll:委托方法中,检查您的平铺视图是否已完全滚动,如果是,则重新定位滚动视图的内容偏移以重新定位内容视图,以便平铺视图返回到中间位置可见区域。如果操作正确,用户就不会注意到您从查看平铺视图的图像跳回到平铺视图本身。
  7. 但是等等!只有中央磁贴视图才会实际响应触摸。毕竟它的所有其他副本都只是图像。我们可以通过覆盖-hitTest:withEvent:来重新定位切片视图以取代用户在调用super之前尝试触摸的任何图像视图。现在所有的触摸都会到达平铺视图。
  8. 确保在重新绘制平铺视图时更新平铺视图的图像。
  9. 这有点疯狂,但它让我将任意交互式UIViews和UIControl扔进一个容器中,让它们从一侧包裹起来,然后再回到另一侧。


    老实说,这可能不是一个很好的解决方案。如果我知道我想要绘制一个可以包裹一个或多个维度的地图,我会将地图分成许多图块。像UIScrollView一样检测某些容器视图上的触摸,并在用户移动触摸时重新定位切片。当瓷砖滚出视线并重新使用它们以显示地图的新可见区域时移除瓷砖。 在一个简单的例子中,您可以仅使用地图图像的两个副本来实现此功能。在一个复杂的情况下,你正在重新创建UIScrollView的大部分内容;缩放您显示的图块,并可能以不同的分辨率加载不同的图块集,以减少内存使用并在缩放时提高分辨率。