David Ansermot ma rację, że xcassets jest o wiele lepsze podejście i zdecydowanie preferowane. Jeśli nie możesz tego użyć (działa na przykład na starszych wersjach iOS), nadal umieszczaj wszystko w jednym katalogu i używaj imageNamed:
. Ma to znaczące korzyści z buforowania w porównaniu z ręcznym ładowaniem pliku.
An asset catalog (xcassets) to (stosunkowo) nowy, ujednolicony sposób zarządzania zasobami obrazu. Obrazy nie są już dostępne jako oddzielne pliki na dysku. Zamiast tego imageNamed:
sprawdza katalog zasobów i pobiera właściwy zasób.
Przed katalogiem zasobów (i nadal dla nie-obrazów) aktywa były przechowywane w zlokalizowanych katalogach. Wszystkie nielokalizowane zasoby zostaną umieszczone w katalogu o nazwie Resources
(bez względu na to, gdzie te pliki mogą znajdować się w drzewie źródłowym i bez względu na to, w jaki sposób pliki te mogą znajdować się w folderach Xcode). Zlokalizowane pliki będą przechowywane w katalogach takich jak English.lproj
lub French.lproj
. Po wywołaniu NSBundle
wywołań MyImage
, analizuje każdy zlokalizowany katalog w porządku skonfigurowanym przez użytkownika, a jeśli nie może go znaleźć w żadnym z tych katalogów, wygląda na Resources
.
Teraz możliwe jest przechowywanie pełnych katalogów jako "zasobów" poprzez oznaczenie ich jako odniesień do katalogu w Xcode. W takim przypadku cały katalog zostanie skopiowany do Resources
lub odpowiedniego zlokalizowanego katalogu. W celu znalezienia plików w takim katalogu można użyć metod ...inDirectory:
dla wersji . Tak więc przez większość czasu chcesz po prostu użyć imageNamed:
, który ma pobrać elementy z katalogu zasobów, jeśli są dostępne, a następnie wyszukać zlokalizowane katalogi, a następnie spójrz na Resources
.Jeśli chcesz znaleźć się bez obrazu, lub jeśli z jakiegoś powodu chcesz prawdziwą ścieżkę do pliku, można obliczyć to tak:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];
A jeśli to źródło było w drzewie katalogów (bo było odniesienie katalog w Xcode), można uzyskać dostęp to tak:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon"
ofType:@"png"
inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
może po prostu trzeba uciec się do standardu, z nagą w tył głowy, że nie dostałem tego do pracy. Czy źle rozumiem, że jeśli coś znajduje się na liście zasobów pakietu kopii, oznacza to, że wymieniony folder jest dodawany do pakietu, a następnie może być używany przez NSBundle? Ponieważ użycie ostatniego fragmentu kodu nie działa pomimo, że images.xcassets jest w pakiecie kopii. lista. – DevilInDisguise
Jeśli umieścisz plik w zasobach pakietu kopii, znajdzie się on w folderze głównym. Wszystkie podkatalogi nad nim zostaną usunięte. Jeśli chcesz zachować katalogi, musisz skopiować sam katalog (a jak pamiętam, minęło trochę czasu), musisz uczynić katalog "odniesieniem do katalogu" zamiast "folderem". –
Ale dlaczego Xcode miałby kłopotać się już dodanymi plikami i images.xcassets, aby skopiować zasoby pakietu, ponieważ jest już w folderze głównym, a z drugiej strony istnieją różne foldery/pliki w folderze głównym, które nie są w pakiecie kopii. Z Twojego komentarza wynika, że zasób zasobu kopii jest większy, gdy potrzebujesz dodać folder z folderu głównego aplikacji do aplikacji, prawda? Tak czy siak, jestem nadal trochę zaskoczony, dlaczego to podejście wciąż nie działa. – DevilInDisguise