UISCrollView中有大量小对象

时间:2011-09-06 07:23:57

标签: iphone ios

我们遇到了以下问题。我们需要显示ScrollView内容,其中包含大量小对象(吉他指法和音符),如此屏幕截图http://www.iphones.ru/forum/index.php?app=core&module=attach&section=attach&attach_rel_module=post&attach_id=38991所示。内容本身可以相当大(contentSize.width> 60000),具有相应数量的对象。理论上,屏幕最多可以容纳一百个物体,物体非常小(注释,数字)。

我们尝试使用所有可用对象 - UIImageView,UILabel。如果我们尝试将它们全部同时放在scrollView上,那么应用程序会非常慢并且因内存不足而崩溃。如果我们根据需要添加它们并删除它们,当它们不可见时,那么只有性能缓慢的问题。

决定在具有类似功能的一些顶级应用程序中查看它是如何解决的 - 使用class-dump-z获取TabToolkit的.h文件的源代码(在屏幕截图上)。

他们使用这些类型的方法:

  • (void)drawSignatureNumber :( unsigned char)arg1 inContext:(struct CGContext *)arg2;
  • (void)drawMeasureNumber:(struct CGContext *)arg1;
  • (void)drawRepeatNumber:(struct CGContext *)arg1;

事实证明,我们应该关注Quartz2d和Core Graphics?或者还有其他解决方案吗?

3 个答案:

答案 0 :(得分:3)

虽然我有点不愿意帮助你,因为你公开承认试图从他们的竞争产品中提取另一个开发人员源代码,我建议你看看CATiledLayer,因为它会允许你在屏幕上绘制大面积区域,性能几乎没有降低。

答案 1 :(得分:0)

我们在类似情况下(实际上在相当多的应用程序中)所做的是使用具有5个页面的滚动条(即可见内容宽度的5倍),并动态加载内容。我认为这就是你所说的“如果我们根据需要添加它们并在它们不可见时删除”。正如我所见,这并没有减慢性能,只要视图卸载完全集中在内存管理上。

即。 (比如说我们用了5页)

  • 加载
  • 后,首先将5页加载到滚动条中
  • 当用户向左滑动时,如果左侧需要加载更多内容,请从滚动条中删除最右边的页面,将其余页面向右移动一个,然后在左侧添加新页面。如果用户向右滑动,也同样如此。
  • 如果一端没有更多要加载的内容,请保持原样,并且滚动条会根据需要在结尾处反弹。

道歉,如果我重复你已经使用过的方法,但只是再次说明这一点,根据经验,这对我们来说非常好用于许多高端应用程序,包括非常长的滚动条甚至圆形滚动条,并为我们提供了很好的可定制性。

希望这有帮助。

答案 2 :(得分:0)

我首先想到的是使用NSOperation(线程),因为这是一项密集型操作。

另外,请确保使用正确的方法加载图片,具体取决于您是否要缓存图片。

+ (UIImage *)imageNamed:(NSString *)name

此处图片将被缓存,如果您一次加载多张图片,则不应使用。

+ (UIImage *)imageWithContentsOfFile:(NSString *)path
- (id)initWithContentsOfFile:(NSString *)path

如果您不希望缓存图像,则应选择这两种方法之一来加载图像。将其用于不立即使用的图像。例如。在第一次加载时不在屏幕上的图像。

我建议您查看Effective iPhone App Development - Part 2视频。从第14分钟或第18分钟开始,它将讨论上述问题。

不确定这些是您已经关注的主题,但我认为值得一提。