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

Sti*_*Sti 4 cocoa-touch objective-c catiledlayer ios

我有一个大约7000x6000px的图像.我需要这个在我的应用程序中的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.
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Dav*_*d H 14

Apple有一个非常整洁的项目PhotoScroller,它使用CATiledLayer并允许您滚动几个图像并缩放它们.这看起来非常整洁,直到我发现Apple"欺骗"并预先平铺了图像(大约800个磁贴保存为捆绑中的文件!)

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

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

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

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


Kru*_*lur 5

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

我们作为Cocoa/Cocoa Touch开发人员使用的许多技术都没有受到内心的影响,因为我们通常根本不理解它们并使用它们看起来似乎是一项艰巨的任务.其中一种技术可以在Core Animation中找到,并称为CATiledLayer.它似乎是一种神奇的技术,因为它的大部分实现都是一个黑盒子,这一事实有助于它被误解.CATiledLayer简单地提供了一种绘制非常大的图像的方法,而不会导致严重的内存损坏.无论您在何处部署,这都很重要,但在iOS设备上尤其重要,因为内存非常宝贵,当操作系统告诉您释放内存时,您最好能够这样做,否则您的应用程序将被关闭.这篇博客文章旨在证明CATiledLayer的工作方式与宣传的一样,并且实施它并不像它曾经看到的那么难.