ios7 xcode5 nsbundle

ios7 - Acceda al catálogo de activos pathForResource



xcode5 nsbundle (6)

Parece que:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png"];

No devuelve nada para los activos que se encuentran dentro del catálogo de activos de Images.xcassets. También probé:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images"];

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images.xcassets"];

Pero ninguno de esos funcionó bien.

¿Alguien ha tenido éxito al recuperar rutas a los activos en el catálogo?


Aunque hay un archivo Contents.json (ver a continuación) asociado con cada elemento en xcassets que contiene los nombres de archivo de las imágenes de ese elemento, no parece ser accesible en el nivel del sistema de archivos. Todas las imágenes se colocan en una sola carpeta del sistema de archivos en la compilación. El archivo json se genera automáticamente y no debe editarse, pero proporciona una plantilla para una solución alternativa.

Denomine cada archivo con un sufijo consistente para que coincida con la expresión idiomática, escala y subtipo correspondiente que aparece en el archivo json. Esto requiere trabajo manual al seleccionar la opción ''Mostrar en el buscador'' para cada activo y cambiar el nombre de cada archivo, pero una vez completado, puede usar pathForResource en combinación con una función para agregar el sufijo apropiado al nombre del activo base para recuperar el imagen de tamaño

Código de muestra para recuperar la ruta:

NSString *imageName = @"Add to Cart"; NSString *imageSuffix = [self someMethodThatDeterminesSuffix]; // Example: "-iphone-2x-retina4" NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%@", imageName, imageSuffix] ofType:@"png"];

Ejemplo de archivo Contents.json para el elemento de imagen "Agregar al carro":

{ "images" : [ { "idiom" : "iphone", "scale" : "1x", "filename" : "Add to Cart-iphone-1x.png" }, { "idiom" : "iphone", "scale" : "2x", "filename" : "Add to Cart-iphone-2x.png" }, { "idiom" : "iphone", "filename" : "Add to Cart-iphone-2x-retina4.png", "subtype" : "retina4", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } }


El mismo problema, pero no creo que podamos acceder a él a través de pathForResource: excepto a continuación:

UIImage* image = [UIImage imageNamed:@"name-in-asset-catalog"];

Ha sido claramente documented :

Cada conjunto en un catálogo de activos tiene un nombre. Puede usar ese nombre para cargar programáticamente cualquier imagen individual contenida en el conjunto. Para cargar una imagen, llame al método UIImage: imageNamed: pasando el nombre del conjunto que contiene la imagen.

Descubrí que en el paquete de la aplicación compilada, apareció un archivo llamado "Assets.car" , y creo que son los conjuntos de imágenes completos de mi proyecto, y deberían haber sido comprimidos o algo así.

Consulte la documentación de Apple:

Xcode 5 proporciona una funcionalidad diferente para los catálogos de activos en función del objetivo de despliegue para su proyecto:

  • Para todos los proyectos, las imágenes individuales se pueden cargar utilizando nombres de conjuntos.
  • Para proyectos con un objetivo de implementación de iOS 7, Xcode compila sus catálogos de activos en un formato de archivo binario en tiempo de ejecución que reduce el tiempo de descarga de su aplicación.

Eso es todo.

También busco una forma que no use imageNamed: no quiero que el tiempo de ejecución guarde en caché mis imágenes.


Intente usar el nombre de la imagen como se determina en el paso "Compilar el catálogo de activos". Lo encontrarás en la salida de compilación. Asegúrese de ampliar la transcripción; debería ver algo como esto:

/* com.apple.actool.compilation-results */ /path/to/Debug-iphonesimulator/Your.app/[email protected] /path/to/Debug-iphonesimulator/Your.app/[email protected] /path/to/Debug-iphonesimulator/Your.app/[email protected] /path/to/Debug-iphonesimulator/Your.app/[email protected] /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape@2x~ipad.png

Probado usando +[UIImage imageNamed:] con Xcode 6.1.1.


Para lanzar imágenes e iconos de aplicaciones en particular, las rutas de las imágenes están disponibles a través de las teclas UILaunchImages y CFBundleIcons Info.plist, respectivamente. Parece que esas imágenes se generan individualmente y los valores de Info.plist se actualizan durante la compilación de la aplicación cuando se utilizan catálogos de activos (y si no, esas claves se escriben directamente en la interfaz de usuario de Xcode). Es posible que tenga que escribir algún código para descubrir el diccionario correcto que utilizará, pero las imágenes están disponibles por separado y puede evitar usar imageNamed en ese caso.


Quería acceder a algunos recursos vectoriales para crear UNNotificationAttachment con recursos locales, así que se me ocurrió esta clase de ayuda. Básicamente, solo obtiene la imagen de los activos, guarda sus datos en el disco y devuelve la URL del archivo. Espero que ayude a alguien.

import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: String) -> URL? { let fileManager = FileManager.default let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] let url = cacheDirectory.appendingPathComponent("/(name).png") guard fileManager.fileExists(atPath: url.path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFile(atPath: url.path, contents: data, attributes: nil) return url } return url } }


[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]];

imgName: el nombre del conjunto de imágenes, sin importar el verdadero nombre de la imagen en el conjunto de imágenes.