大衛Ansermot是正確的,xcassets是一個更好的辦法,強烈偏愛。如果你不能使用它(例如在較舊版本的iOS上運行),仍然將所有內容放在一個目錄中並使用imageNamed:
。這對手動加載文件具有顯着的緩存優勢。
一個asset catalog(xcassets)是一種(相對)新的,統一的管理圖像資源的方式。圖像不再作爲磁盤上的單獨文件訪問。相反,imageNamed:
會諮詢資產目錄並提取正確的資產。
在資產目錄之前(仍然是,對於非圖像),資產被存儲在本地化的目錄中。所有未本地化的資產將被放到一個名爲Resources
的目錄中(無論這些文件可能出現在您的源代碼樹中,以及這些文件如何排列在您的Xcode文件夾中)。本地化的文件將存儲在目錄中,如English.lproj
或French.lproj
。當您調用NSBundle
調用加載MyImage
時,它會按照用戶配置的順序查看每個本地化目錄,並且如果在任何這些目錄中都找不到它,它會在Resources
中查找。
現在可以通過在Xcode中將目錄標記爲目錄引用來將完整目錄存儲爲「資源」。在這種情況下,整個目錄將被複制到Resources
或適當的本地化目錄中。爲了在這樣的目錄中查找文件,您可以使用NSBundle
方法的...inDirectory:
版本。 因此,大多數情況下,您只想使用imageNamed:
,這將從資產目錄中提取東西(如果可用),然後搜索本地化目錄,然後查看Resources
。如果你需要找到一個非圖像,或者出於某種原因,你要的文件真實路徑,你可以計算出它是這樣的:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];
如果該資源是在一個目錄樹(因爲它在Xcode的目錄參考),你可以這樣訪問:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon"
ofType:@"png"
inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
也許我只是不得不求助於標準,在我的腦海裏嘮叨,我沒有得到這個工作。我的理解錯誤是,如果某些東西在複製束資源下列出,那意味着列出的文件夾被添加到束中,然後可以通過NSBundle使用?因爲儘管images.xcassets位於副本包res上,但使用最後一個代碼段仍然無效。名單。 – DevilInDisguise
如果您將文件放入複製束資源中,它將位於根文件夾中。它上面的所有子目錄都將被刪除。如果你想保留目錄,你必須複製目錄本身(正如我記得的那樣,這已經有一段時間了),你必須使目錄成爲「目錄引用」而不是「文件夾」。 –
但是爲什麼Xcode會打擾已經添加文件和images.xcassets複製束資源,因爲它已經在根文件夾中,另一方面根文件夾中有不在複製束中的各種文件夾/文件。從您的評論中可以看出,當您需要將應用程序根文件夾之外的某個文件夾添加到應用程序時,複製包資源更多,對嗎?無論哪種方式,我仍然有點困惑,爲什麼這種方法仍然無法正常工作。 – DevilInDisguise