我正在开发另一个画布应用程序,它的画布比屏幕大很多倍。
我需要一些建议/指导。

基本上我想要的是在这个大画布上滚动,仅在可见区域中绘制。
我在想两种方法:

  • 可以绘制64x64(或其他大小)“平铺”,然后在滚动时仅加载新的图块。
  • 记录所有用户笔画(点)并滚动计算指定区域中的哪些,并仅使用屏幕尺寸的画布进行绘制。

  • 如果这很重要,我将使用cocos2d作为原型。

    最佳答案

    忘了2000x200的限制,我有一个开源项目,可以绘制18000 x 18000 NASA图像。

    我建议您将此任务分为两部分。首先,滚动。根据CodaFi的建议,滚动时将提供CATiledLayers。所有这些都是您创建的CGImageRef-真正的大画布的子图像。然后,您可以轻松地支持放大和缩小。

    第二部分是与用户交互以绘制或以其他方式影响画布。当用户停止滚动时,您将创建一个不透明的UIView子类,将其作为子视图添加到主视图中,从而覆盖承载CATiledLayers的视图。目前,您需要显示此视图,并使用适当的信息填充该视图,以便它可以正确地绘制较大画布的该部分(在这种情况下,用圆圈表示这种颜色等等)。

    您将使用此叠加视图的drawRect:方法进行绘制。因此,当用户执行更改视图的操作时,可以根据需要执行“setDisplayInRect:”以强制iOS调用您的drawRect:。

    当用户决定滚动时,您需要使用用户所做的任何更改来更新大型画布模型,然后删除不透明的覆盖层,并让CATiledLayers绘制较大图像的适当部分。这种过渡可能是避免视觉故障的过程中最棘手的部分。

    假设您有用于画布的大量对象定义。当您需要为图块创建CGImageRef时,可以扫描它以查找对象的框架与图块的框架之间的重叠,然后才绘制该图块所需的那些项目。

    08-28 01:25