0

我实现了一个自定义 UIView,它可以绘制无法以任何其他方式绘制的复杂图形(通过 drawRect)。由于绘制的项目位于一个非常大的平面上(想想世界地图),由于内存限制,我无法使用 UIScrollView。我管理自己的原点和缩放变量,并根据这些变量绘制图形。我还实现了用于平移、放大和缩小、双击和单击等的手势识别器。这一切都很棒。

但我需要优化:当用户用他/她的手指平移时,我相应地更改我的内部原点变量并调用 setNeedsDisplay。这在模拟器和 iPhone 5 上运行良好,但在 iPad 3 上它有点慢(不算太糟糕,但仍然很明显)。我想要实现的是只为那些需要显示的区域(即屏幕上由于平移而显示的新到达项目)调用 setNeedsDisplay,并滚动(移动)已经在屏幕上的区域。显示屏幕的 1/10 会比显示 1/1 快得多,因为我已经进行了优化以快速确定哪些项目落在屏幕上并只显示那些项目。

换句话说,而不是调用

thisView.originPoint = thisView.originPoint - 10;
[thisView setNeedsDisplay];

我希望我能以某种方式打电话

thisView.originPoint = thisView.originPoint - 10;
[thisView setNeedsDisplayInRect: CGMakeRect(320-10,0,320,480)
    withScroll: CGMakerect(0,0,320-10,480) scrollBy: CGPointMake(-10,0);

这显然只是程式化的代码。仅仅滚动视图的内容是没有帮助的(虽然我现在不知道该怎么做),因为 drawRect 可能会在很久以后调用,并且可能与对 setNeedsDisplay 的另一个调用结合使用。

4

1 回答 1

0

您可以考虑在完全绘制视图后[self.layer renderInContext:aContext]缓存屏幕图像。UIGraphicsGetImageFromCurrentImageContext()当用户平移时,该图像可以绘制在不同的位置,例如。用户拖动时向左平移。同时,必要的数据也会被异步加载。在用户完成拖动或数据加载后,您将设置一个标志让 setNeedsDisplay 在所需部分绘制,然后缓存新图像。

此外,CATiledLayer类的功能与您正在寻找的类似,但它需要对您已有的内容进行更多修改。

希望这可以帮助!

于 2013-04-02T03:28:46.650 回答