没有CATiledLayer的iOS应用中的巨大图像?

时间:2012-08-23 10:16:45

标签: objective-c ios cocoa-touch catiledlayer

我的图像大约是7000x6000像素。我需要这个在我的应用程序中的scrollview / imageView,但这是显示的巨大的方式。它应该是一种地图。我希望将应用程序的大小保持在最小,并且图像大约为13mb(以.jpg为单位)。在.png中它超过100mb,这是不可接受的。许多人建议CATiledLayer作为选项,但我相信这会导致更大的文件大小。无论如何,我尝试用CATiledLayer来做,并在TileCutter中创建我自己的瓷砖((.jpg中的瓷砖),尺寸也不算太差。但我到处都有错误。 iOS版CATiledLayer对我来说是一个谜,我无法找到解决这个问题的方法。我得到一个错误说一些关于java等价的“索引超出数组的范围”,即使该数组具有该特定索引的内容.. 它有一个返回数组的方法。该数组包含.plist的数据。在返回之前,我注销了数组的内容,给了我很好的数据。电话正试图访问

[array objectAtIndex:0]

并将其放入字典中,但抛出OutOfBounds。当注销整个阵列时,我可以清楚地看到内容,但是在注销时

NSLog("%@",[method objectAtIndex]); I get the same exception.

无论如何,CATiledLayer只给了我一些问题。我一直在对PhotoScroller项目进行逆向工程而没有运气。有没有其他解决方案?

感谢。

2 个答案:

答案 0 :(得分:14)

Apple拥有这个非常整洁的项目PhotoScroller,它使用CATiledLayer并允许您滚动几个图像并缩放它们。这看起来真的很整洁,直到我发现苹果“欺骗”并预先平铺了图像(大约800个瓷砖保存为捆绑中的文件!)

我需要类似的功能,但必须从网络下载图像。因此PhotoScrollerNetwork来了。使用TiledImageBuilder,您可以下载(或从磁盘读取)大量图像 - 我甚至测试了18000x18000图像 - 它可以工作。

这个类的作用是在下载时(使用libjpegturbo时)开始平铺图像,或者可以保存文件然后平铺(需要更长时间)。该类计算出需要多少级别的细节才能以全分辨率显示图像并调整大小以适合包含视图(滚动视图)。

该类使用磁盘缓存来保存磁贴,但使用和旧的Unix技巧创建一个文件,打开它,然后取消链接,以便瓦片永远不会真正得到保存 - 一旦该类被释放(和文件描述符)关闭)瓷砖被释放(或者如果您的应用程序崩溃,它们也会被释放。

有人在内存非常有限的iPad 1上遇到问题,因此当同时加载多个图像时,该类现在会限制其对文件系统的使用。今年我和WWDC的iOS内核经理进行了讨论,在向他解释了限制技术之后,他说算法(管理磁盘缓存使用量)可能是最好的技术。

答案 1 :(得分:5)

我认为那些建议CATiledLayer的人是对的。你真的应该用它!如果您需要使用该技术显示大型位图的示例项目,请查看此处:http://www.cimgf.com/2011/03/01/subduing-catiledlayer/

  

我们用作Cocoa / Cocoa Touch开发人员的许多技术都有   由于经常我们根本不这样做,所以不会被胆小的人所触动   了解他们并使用它们似乎是一项艰巨的任务。之一   这些技术可以在Core Animation中找到并被称为   CATiledLayer。这似乎是一种神奇的技术,因为   它的大部分实现都是一个黑盒子和这个事实   导致它被误解。 CATiledLayer只提供了一个   绘制非常大的图像而不会导致严重的记忆命中的方法。   无论您在哪里部署,这都很重要,但尤其如此   在iOS设备上的问题,因为内存是宝贵的,当操作系统告诉你   为了释放记忆,你最好能够这样做,或者你的应用程序将是   拿下来。这篇博客文章旨在证明这一点   CATiledLayer的工作方式与广告一样,并且实现它并不像它那样难   它可能曾经有过。