David Ansermot è giusto che xcassets è un approccio molto meglio e fortemente preferito. Se non è possibile utilizzarlo (eseguendo su versioni precedenti di iOS, ad esempio), inserire ancora tutto in una directory e utilizzare imageNamed:
. Ciò ha notevoli vantaggi di memorizzazione nella cache rispetto al caricamento manuale del file.
Un asset catalog (xcassets) è un (relativamente) nuovo modo unificato di gestione delle risorse di immagine. Le immagini non sono più accessibili come file separati sul disco. Invece, imageNamed:
consulta il catalogo delle risorse e recupera la risorsa corretta.
Prima di cataloghi di risorse (e ancora, per non immagini), le risorse erano memorizzate in directory localizzate. Tutte le risorse non localizzate verranno inserite in una directory denominata Resources
(indipendentemente da dove tali file possano apparire nella struttura dei sorgenti e non importa in che modo tali file possano essere disposti nelle cartelle Xcode). I file localizzati verrebbero archiviati in directory come English.lproj
o French.lproj
. Quando si effettuano chiamate NSBundle
per caricare MyImage
, esso esamina ogni directory localizzata nell'ordine che l'utente ha configurato e, se non riesce a trovarlo in nessuna di queste directory, appare in Resources
.
Ora è possibile memorizzare directory complete come "una risorsa" contrassegnandole come riferimenti di directory in Xcode. In tal caso, l'intera directory verrà copiata in Resources
o nella directory localizzata appropriata. Per trovare i file all'interno di tale directory è possibile utilizzare la versione ...inDirectory:
dei metodi NSBundle
. Quindi, per la maggior parte del tempo, si desidera utilizzare semplicemente lo imageNamed:
, che recupera elementi dal catalogo delle risorse, se disponibile, quindi cerca nelle directory localizzate, quindi cerca in Resources
.Se hai bisogno di trovare un non-immagine, o se per qualche motivo si desidera che il percorso vero e proprio del file, è possibile calcolare in questo modo:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];
E se quella risorsa fosse in un albero (perché era un riferimento directory in Xcode), è possibile accedere in questo modo:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon"
ofType:@"png"
inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
fonte
2015-04-15 13:49:29
forse ammalato, non devo fare altro che ricorrere allo standard, con un ronzio nella parte posteriore della testa che non ho potuto farlo funzionare. Ho torto a capire che se qualcosa è elencato nelle risorse del pacchetto di copia, significa che la cartella elencata viene aggiunta al pacchetto e può quindi essere utilizzata tramite NSBundle? Perché l'utilizzo dell'ultimo snippet di codice non funziona malgrado images.xcassets si trovi sul res del pacchetto di copia. elenco. – DevilInDisguise
Se si inserisce un file nelle risorse del pacchetto di copia, questo si troverà nella cartella principale. Tutte le sottodirectory sopra di esso verranno rimosse. Se vuoi mantenere le directory, devi copiare la directory stessa (e come ricordo, è passato un po 'di tempo), devi fare in modo che la directory sia un "riferimento alla directory" piuttosto che una "cartella". –
Ma perché Xcode dovrebbe preoccuparsi di avere già aggiunto file e images.xcassets per copiare le risorse del bundle poiché si trova già nella cartella principale, e d'altra parte ci sono varie cartelle/file nella cartella radice che non sono nel pacchetto di copia. Dal tuo commento sembra che la copia del pacchetto di risorse sia più utile quando devi aggiungere alcune cartelle dall'esterno della cartella principale dell'app all'app, giusto? In ogni caso, sono ancora un po 'sconcertato sul perché questo approccio non funzioni ancora. – DevilInDisguise