我正在开发一个需要绘制s.th.的应用程序。像网络图。不幸的是,这个图表可能变得非常大,有数以千计的可移动物体。
我试图在UIScrollView中放置一个巨大的UIView,但很快发现由于内存限制,这将无效。 所以我尝试了另一种方法:目前我有一个UIView,其大小与UIScrollView的可见部分完全相同。滚动视图设置为不处理滚动(仅限于捏合)。相反,我处理UIView中的滚动。每次用户滚动时,所有图形对象(那些图形对象当前只是NSObject的子类,其中包含自定义绘图代码)都会被移动,因此视图似乎在滚动。在drawRect中,我只绘制当前可见的图形。 如果它们被移出/在可见框架中,我也会不断添加和删除子图层 即使有数千个物体,这也非常顺利。
不幸的是,这种方法有一些缺点:
我无法缩小以查看图表中的所有对象,而是用户只能看到其中的一部分
我没有得到UIScrollView提供的惯性滚动
我试过的其他方法,比如CATiledLayer,也不起作用,因为图中的所有对象都可以被用户拖动,如果我使用CATiledLayer,它看起来真的很难看...... 在用户滚动时与其他UIViews交换UIView可能有助于惯性滚动,但它使一切变得更加复杂并且完全缩小仍然不起作用: - (
您是否知道绘制可能非常大的图表的最佳做法?
//编辑:我最终得到了一个uiscrollview,它有一个子视图,它有一个包含许多子层的cascrolllayer。放大和缩小uiscrollviews子视图的框架时,view.frame = scrollview.bounds会不断更改为uiscrollviews界限。在拖动滚动视图时,始终强制cascrolllayer滚动到scrollview的当前偏移量。 我需要对uiscrollview进行子类化并进行黑客攻击,以便使缩放工作很好,但现在它运行良好。这种方法非常有效,并允许包含大量可拖动元素的非常大的图形。
//编辑:请参阅下面的我的其他答案,上面的方法并没有像我最初想的那样有效,尤其是缩放部分
答案 0 :(得分:0)
CATiledLayer绝对是你应该在这里使用的 - 没有真正的另一种解决方案可以让你在巨大的可缩放画布上使用Quartz / UIKit绘图。对于任何需要交互式(拖动或动画或其他)的内容,您可以在主平铺图层中禁用其显示,并覆盖其上仅包含与之交互的对象的另一个视图或图层。