2010-03-07 10 views
10

en el proyecto actual Tengo un número de carpetas, con subcarpetas, y estas contienen imágenes: 01.png, 02.png.iPhone SDK: subFolders dentro del paquete principal

Carpeta1/FolderA/f1.png Carpeta1/FolderB/F1.png

Cuando puedo compilar la aplicación, miré el interior del .app y se dio cuenta de que todas las imágenes se colocan en el nivel superior, con sin subcarpetas.

Así que está claro cuando se trata de cargar la imagen esto no funciona:

NSString * rutaArchivo = [[NSBundle mainBundle] pathForResource: @ "F1" OfType: @ "PNG" elDirectorio: @ "Carpeta1/Carpeta A "];

Pero aún más extraño, al cargar la imagen "F1", la imagen de carga actualmente "F1"

UIImageView * imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "f1.png"]] ;

¿Alguien tiene ideas sobre cómo evitar este problema?

¿Hay una opción de compilación para crear las carpetas en el paquete de la aplicación?

TIA.

+0

¿Cuál es el problema? Parece que tus imágenes se están cargando bien. – kubi

+0

El problema es que la imagen f1.png no es F1.png. – user279778

+0

Muestra una imagen incorrecta. – user279778

Respuesta

25

Para crear las subcarpetas dentro del paquete .app, debe marcar la opción "Crear referencias de carpeta para cualquier carpeta agregada" en lugar de la predeterminada "Crear grupos recursivamente para cualquier carpeta agregada" Ahora en XCode, aparece su carpeta importada azul en lugar de amarillo. Build and go y debería ver carpetas en su archivo .app.

+0

¡Perfecto! El error que cometí fue arrastrar y soltar la estructura de carpetas en la carpeta de recursos en lugar de hacer clic en la opción, seleccionar "Agregar-> Archivos existentes" y luego seleccionar el botón de opción "Crear referencias de carpetas para cualquier carpeta agregada". Entonces la carpeta es azul. – user279778

+0

¿cómo puedo hacer referencia a los archivos en subcarpetas creadas como se describe arriba? 'pathForResource: ofType: inDirectory:' no funciona para mí. – pkyeck

+2

bien, me di cuenta - quizás alguien esté interesado en esto: 'NSString * folderPath = [NSString stringWithFormat: @"% @/myfolder ", [[NSBundle mainBundle] bundlePath]];' – pkyeck

0

Antes que nada, las carpetas que creas en Xcode son simplemente estructuras organizativas sin ninguna contrapartida en el nivel del sistema de archivos. En otras palabras, todas las carpetas a excepción de la carpeta "Clases" se aplanan en el nivel del sistema de archivos. Por lo tanto, incluso si coloca su archivo de imagen en la siguiente ubicación dentro de xcode, todavía existiría en el nivel superior en el sistema de archivos: f1/f2/f3/f4/f5/image.png. Por lo tanto, en el método pathForResource, no debe incluir el argumento inDirectory.

En cuanto a la segunda cuestión, mac osx no reconoce nombres de archivo que distinguen entre mayúsculas y minúsculas. Por lo tanto, f1 y F1 son equivalentes a mac osx y harán referencia al mismo archivo. Se puede ver fácilmente esto mediante la ejecución de los 2 comandos siguientes en una sesión de terminal:

touch f 
touch F 

se dará cuenta de que existe sólo 1 archivo después de esto: es decir, f. Si invierte los 2 comandos, aún obtendrá un archivo, pero se llama F.

+0

Las imágenes están en carpetas reales en el sistema, y ​​no solo en XCode. Pero Xcode no copia sobre las carpetas, solo los archivos png. – user279778

+0

Lo que parece estar sucediendo es que las imágenes del nombre "f1.png" son golpeadas por la imagen "F1.png". – user279778

+0

sí, eso es cierto sobre la insensibilidad de la caja bien. – user279778

0

ennuikiller tiene razón. Creo que puede organizar sus imágenes a través del Finder en la subcarpeta y luego actualizar la ubicación de la imagen en XCode haciendo clic con el botón derecho en su imagen y seleccionando la opción "Obtener información". Luego establece el nuevo directorio.

Saludos.

+0

Claro, pero eso aún no crea carpetas dentro de .app cuando está construido. – user279778

0

sólo quería añadir a la respuesta de Mugunth, para dar seguimiento a parte de la pregunta original que estaba tratando de usar:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"f1" ofType:@"png" inDirectory:@"Folder1/FolderA"]; 

... para acceder a los archivos añadidos usando referencias de carpetas.La llamada anterior 'pathForResouce' funcionará en simuladores pero no en iPhones reales (no se devolverán), ya que no parecen reconocer subcarpetas en la parte 'inDirectory' del método. Sin embargo, sí los reconocen en la parte 'pathForResource'. Así que la manera de reformular lo anterior de manera que funciona en iPhones es:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"FolderA/f1" ofType:@"png" inDirectory:@"Folder1"]; 
0

He seguido su respuesta pero las costuras de todos los archivos se almacenan en la raíz plana. Si utilizo el siguiente código para obtener la ruta completa

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("About"), CFSTR("png"), NULL); 
UInt8 filePath[PATH_MAX]; 
CFURLGetFileSystemRepresentation(url, true, filePath, sizeof(filePath)); 

me sale como resultado:/Users/Iosif/Library/Application Support/simulador de iPhone/6.1/Aplicaciones/33FB4F79-999C-4455-A092-906A75226CDB /Arithmetics.app/About.png

Cuestiones relacionadas