我想动态加载xcassets目录中的所有图像。这些文件名为StockPhoto#,其中#是列表中的数字。如果我可以在运行时访问我的StockPhotos.xcassets来计算目录中的所有文件,那么每次添加新的库存照片时我都不必手动加载文件。
如果还有其他解决方法可以解决这个问题,我会对此持开放态度,但我也非常好奇文件系统如何处理xcassets-他们是否只是引用了一套的文件,或实际上他们自己的目录。有关这方面的信息很少。
答案 0 :(得分:3)
编译iOS项目后,会编译xcassets
以生成图像文件或专有.car
文件。在后一种情况下,图像不会存储在您可以浏览的目录中。
如果您的“部署目标”小于iOS7 (意味着您的应用仍然可以在iOS6上运行)
<YourImageName>.png
,<YourImageName>@2x.png
,<YourImageName>~ipad.png
,<YourImageName>~ipad@2x.png
等等on,对于xcassets的每个图像集。如果您的“部署目标”是iOS7或更高版本(意味着您的应用只能在iOS7 +上运行)
.car
文件(如果这个文件实际上是一个sqlite3数据库或某些专有格式或者诸如此类的东西,我真的没有查找,但是谁在乎,你不应该无论如何操纵它)。这个大的.car
文件包含所有图像,包含所有提供的变体,甚至包含切片信息(如果您将其中一些切片用于平铺或使用它们作为9补丁图像使用为此提供的工具资产目录编辑器)无论产生什么结果,你都不应该/不应该像这样深入研究你的包的内部细节。 .car
文件的格式甚至可能会从一个iOS版本更改为另一个版本(谁知道?这是我们不应该处理的所有内部细节)所以不要将逻辑基于它。
[编辑]:如果您需要确保在编辑结尾处有一组包含您的图像的目录,您可以使用文件夹参考(引用一个真实的文件夹) Finder,而不是Xcode“组”作为Xcode的Project Navigator中的组文件,然后使用代码来浏览它。但是你必须处理其他细节,比如只浏览与当前设备相匹配的文件(iPhone与iPad,非视网膜与视网膜......),这样只会在你的情况下进一步改变问题;你真的应该使用一个常量来声明图像的数量(或者把它放在一些PLIST文件中),然后通过它们进行迭代。
由于您在编译时提供的文件将在您的Bundle中 - 由于数字签名后无法更改,因此无论如何编译应用程序时图像的数量永远不会改变。 (这不像是你使用了Documents目录并启用了iTunes文件共享等等,让用户自己添加图片; - )
答案 1 :(得分:3)
如果此问题还有其他解决方案,我可以接受
问题是在运行时没有对资产目录进行内省:它不是&#34;&#34;&#34;你可以&#34;看&#34;就Objective-C和Cocoa Touch而言。
此类问题的常见解决方案是在一开始就将一个装满图像的文件夹拖到项目中,当您这样做时,选择&#34;为任何添加的文件夹创建文件夹引用&#34;在对话框中 - 不&#34;为任何添加的文件夹创建组&#34;。结果是文件夹被复制到您的应用程序包中,现在您可以使用普通的文件系统方法来说出&#34;此文件夹中的每个文件&#34;。
答案 2 :(得分:1)
如果你的目标是iOS 7+,那么没有。 Xcode会将文件打包成您无法直接访问的专有格式(.car)。
使用imageNamed:
方法,或者不要将图像目录用于您需要直接访问的文件。
答案 3 :(得分:0)
正如@AliSoftware建议您可以将所有资产图像存储到plist并稍后访问它们以获取更多详细信息see here