¿Imágenes enormes en la aplicación de iOS sin CATiledLayer?

Tengo una image de aproximadamente 7000x6000px. Necesito esto para estar en una vista de scroll / imageView en mi aplicación, sin embargo, esta es una manera enorme de mostrar. Se supone que es una especie de map. Tenía la esperanza de mantener el tamaño de la aplicación al mínimo, y la image es de unos 13 mb en .jpg. En .png es más de 100 mb, lo cual es inaceptable. Muchos han sugerido CATiledLayer como una opción, pero creo que esto daría como resultado tamaños de file aún más grandes. De todos modos, traté de hacerlo con CATiledLayer , y creo mis propias fichas en TileCutter, (fichas en .jpg), y el tamaño no era tan malo. Pero estoy teniendo errores en todo el lugar. La versión de iOS de CATiledLayer es un misterio para mí, y no puedo encontrar una manera de resolver esto. Aparece un error al decir algo sobre el "índice fuera de límites de matriz" equivalente a java, aunque la matriz tiene contenido en ese índice específico. Tiene un método que devuelve una matriz. La matriz contiene datos de una .plist. Antes de la devolución desconecté el contenido de la matriz, dándome buenos datos. La llamada está intentando acceder

[array objectAtIndex:0]

y ponerlo en un dictionary, pero arroja OutOfBounds. Cuando se desconecta la matriz completa, puedo ver claramente el contenido, pero cuando se desconecta

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

De todos modos, CATiledLayer no me ha dado más que problemas. He invertido la ingeniería inversa del proyecto PhotoScroller sin suerte. ¿Alguien tiene alguna otra solución?

Gracias.

Apple tiene este proyecto realmente bonito, PhotoScroller, que usa CATiledLayer y te permite desplazarte por varias imágenes y hacer zoom. Esto parecía realmente limpio hasta que descubrí que Apple "engañó" y pre-embaldosó las imágenes (¡alnetworkingedor de 800 azulejos guardados como file en el package!)

Necesitaba una capacidad similar, pero tuve que download las imágenes de la networking. Así surgió PhotoScrollerNetwork . Con TiledImageBuilder puedes download (o leer desde el disco) imágenes masivas, incluso probé una image de 18000×18000, y funciona.

Lo que esta class hace es comenzar a embaldosar la image a medida que se descarga (cuando se usa libjpegturbo) o se puede save el file y luego azulejar (lleva más time). La class se da count de cuántos niveles de detalle se necesitan para mostrar la image con una resolución completa y con el tamaño adecuado para la vista que contiene (una vista de desplazamiento).

La class usa el caching de disco para contener los mosaicos, pero usa el viejo truco de Unix para crear un file, abrirlo y desvincularlo para que las mosaicas nunca se guarden realmente, una vez que la class se desalienta (y el descriptor del file se cierra), el Los azulejos se liberan (o si su aplicación falla se liberan también.

Alguien tuvo problemas en un iPad 1 con su memory bastante limitada, por lo que la class ahora acelera el uso del sistema de files al cargar simultáneamente varias imágenes. Tuve una discusión con el gerente de kernel de iOS en WWDC este año, y después de explicarle la técnica de aceleración, dijo que el algorithm (en la gestión de la cantidad de uso de caching de disco) probablemente fue la mejor técnica que se podría usar.

Creo que aquellos que sugirieron CATiledLayer tienen razón. ¡Realmente deberías usarlo! Si necesita un proyecto de ejemplo que muestre un enorme bitmap con esa tecnología, mire aquí: http://www.cimgf.com/2011/03/01/subduing-catiledlayer/

Muchas tecnologías que utilizamos como desarrolladores de Cocoa / Cocoa Touch permanecen intactas por los débiles de corazón porque a menudo simplemente no las entendemos y emplearlas puede parecer una tarea desalentadora. Una de esas tecnologías se encuentra en Core Animation y se conoce como CATiledLayer. Parece una especie de tecnología mágica porque gran parte de su implementación es algo así como un cuadro negro y este hecho contribuye a que se lo entienda mal. CATiledLayer simplemente proporciona una manera de dibujar imágenes muy grandes sin incurrir en un golpe de memory severo. Esto es importante sin importar dónde se esté desplegando, pero es especialmente importante en los dispositivos con iOS, ya que la memory es valiosa y cuando el sistema operativo le dice que libere memory, será mejor que lo haga o que su aplicación sea eliminada. Esta publicación de blog tiene la intención de demostrar que CATiledLayer funciona como lo anuncian y su implementación no es tan difícil como parecía.