我可以访问文件系统上的xcassets目录吗?

use*_*ser 6 xcode cocoa-touch ios asset-catalog xcasset

我想动态加载xcassets目录中的所有图像.这些文件名为StockPhoto#,其中#是列表中的数字.如果我可以在运行时访问我的StockPhotos.xcassets来计算目录中的所有文件,那么每次添加新的库存照片时我都不必手动加载文件.

如果这个问题有其他解决方案,我对此持开放态度,但我也非常好奇文件系统如何处理xcassets - 无论它们只是引用一组文件,还是实际上是它们自己的目录.有关这方面的信息很少.

Ali*_*are 5

编译 iOS 项目后,xcassets将编译生成图像文件或专有.car文件。在后一种情况下,图像不会存储在您可以浏览的目录中。

\n

如果您的“部署目标”小于 iOS7(意味着您的应用程序仍然能够在 iOS6 上运行)

\n
    \n
  • 它将为您的 xcassets 的每个图像集生成与您在不使用资产目录的情况下必须生成的相同的图像文件集,即<YourImageName>.png<YourImageName>@2x.png、等。<YourImageName>~ipad.png<YourImageName>~ipad@2x.png
  • \n
\n

如果您的“部署目标”是 iOS7 或更高版本(意味着您的应用程序只能在 iOS7+ 上运行)

\n
    \n
  • 它将.car在最终包中生成一个大文件(我并没有真正查找该文件是否实际上是 sqlite3 数据库或某种专有格式或其他什么,但谁在乎呢,无论如何你都不应该操纵它)。这个大.car文件包含所有图像及其提供的所有变体,甚至还包含切片信息(如果您确实对其中一些进行切片以进行平铺或使用资产目录编辑器中提供的工具将它们用作 9 补丁图像)
  • \n
\n
\n

无论产生什么结果,您都不应该/不应该像这样深入研究捆绑包的内部细节。文件的格式.car甚至可能从一个 iOS 版本更改为另一个版本(谁知道呢?毕竟这是我们不应该处理的内部细节),因此不要将您的逻辑基于它。

\n
\n

[编辑]:如果您需要确保在编译结束时有一个包含图像集的目录,您可以使用文件夹引用(引用 Finder 中的真实文件夹,而不是 Xcode“组”)作为 Xcode 项目导航器中的唯一组文件),然后使用代码来浏览它。但随后您将不得不处理其他细节,例如仅浏览与当前设备匹配的文件(iPhone 与 iPad、非视网膜与视网膜\xe2\x80\xa6),因此这只会使问题进一步转移到您的设备中。案件; 您确实应该在某处使用常量来声明图像数量(或者将其放入某些 PLIST 文件中)并迭代它们。

\n

由于您在编译时提供的文件将位于 Bundle \xe2\x80\x94 中,一旦编译就无法更改,因为它经过数字签名 \xe2\x80\x94,因此一旦编译应用程序,图像的数量就永远不会改变。(这不像您使用 Documents 目录并启用 iTunes 文件共享或其他什么,让用户自己添加图像;-))

\n
\n


mat*_*att 5

如果这个问题还有其他解决方案,我愿意接受

问题是在运行时没有对资产目录进行内省:就 Objective-C 和 Cocoa Touch 而言,它不是您可以“看到”的“东西”。

此类问题的通常解决方案是从一开始就将一个装满图像的文件夹拖到您的项目中,然后在对话框中选择“为任何添加的文件夹创建文件夹引用” -而不是“为任何添加的文件夹创建组”。结果是文件夹被复制到你的应用程序包中,现在你可以使用普通的文件系统方法说“这个文件夹中的每个文件”。