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