在iPad上的UIScrollView中绘制无限大图形的最佳方法



我目前正在制作一个需要绘制s.th的应用程序。就像网络图一样。不幸的是,如果有成千上万个可移动的对象,这个图会变得非常大。

我试图把一个巨大的UIView在一个UIScrollView,但很快注意到这不会工作,因为内存限制。所以我尝试了另一种方法:目前我有一个UIView它正好有UIScrollView可见部分的大小。scrollview被设置为不处理滚动(只处理捏屏)。相反,我在UIView中处理滚动。每次用户滚动时,所有图形对象(这些图形对象目前只是NSObject的子类,其中包含自定义绘图代码)都被移动,所以看起来视图正在滚动。在drawRect中,我只绘制当前可见的图形。此外,我不断添加和删除子层,如果他们移出/在可见帧即使有数千个对象,这也能很顺利地工作。

不幸的是,这种方法有一些缺点:

  • 我不能缩小看到图形中的所有对象,而用户只能看到它的一部分

  • 我没有得到UIScrollView提供的惯性滚动

我尝试过的其他方法,比如CATiledLayer,也不起作用,因为图形中的所有对象都可以被用户拖动,如果我使用CATiledLayer,它看起来真的很丑…当用户滚动时,将UIView与其他UIView交换可能有助于惯性滚动,但它使一切变得更加复杂,完全缩小仍然不起作用:-(

你知道绘制非常大的图形的最佳实践吗?

//编辑:我结束了一个uiscrollview,它有一个子视图,它有一个cascrolllayer,它有许多子层。当放大和缩小uiscrollviews子视图的帧时,通过view.frame = scrollview.bounds, uiscrollviews的边界会不断改变。当拖动滚动视图时,cascrolllayer总是被迫滚动到滚动视图的当前偏移量。我需要子类化uiscrollview和hack为了使缩放工作得很好,但它现在工作得很好。这种方法工作得非常好,并且允许非常大的图形具有许多可拖动元素。

//编辑:看看下面我的另一个答案,上面的方法并没有像我最初想象的那样有效,尤其是缩放部分

CATiledLayer绝对是你应该在这里使用的-没有真正的其他解决方案可以让你使用石英/UIKit在一个巨大的可缩放画布上绘图。对于任何需要交互的东西(拖动或动画或其他),你可以在主平铺层中禁用其显示,并在其上覆盖另一个视图或层,该视图或层仅包含与之交互的对象。

最新更新