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

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

如果还有其他的解决scheme,我可以这么做,但是我也很好奇xcassets是如何被文件系统处理的 – 不pipe它们是只是引用了一组文件,还是实际上是它们自己的目录。 有关这方面的信息是稀疏的。

如果还有其他的解决办法,我可以这样做

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

解决这类问题的通常办法是将一个完整的图像文件夹拖放到项目中,然后在对话框中select“为所有添加的文件夹创build文件夹引用” – 而不是 “为所添加的文件夹创build组” ”。 结果是该文件夹被复制到您的应用程序包中,现在您可以使用普通的文件系统方法说出“该文件夹中的每个文件”。

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

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

  • 它会生成相同的一组图像文件,而不使用资产目录,即<YourImageName>.png<YourImageName>@2x.png<YourImageName>~ipad.png<YourImageName>~ipad@2x.png等等,为您的xcassets的每个图像集。

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

  • 它会在最后一个包中生成一个大的.car文件(我真的不知道这个文件是否是一个sqlite3数据库或者某种专有格式或者是什么,但是谁在乎,你不应该操纵它)。 这个大的.car文件包含了所有的图像以及所有提供的变体,甚至包括切片信息(如果您已经将其中的一些切片信息切片,或者使用资产目录中提供的工具将其作为9贴片图像使用编辑)

无论产生的结果如何,您都不应该/不应该深入到您的捆绑软件的内部细节中。 .car文件的格式甚至可以从一个iOS版本改变为另一个版本(谁知道这是内部细节,我们不应该处理这些内部细节),所以不要把你的逻辑基于它。

[编辑]:如果你需要确保在编辑结束时有一组图像的目录,你可以使用一个文件夹引用(在Finder中引用一个真实的文件夹,而不是Xcode的“组”作为Xcode Project Navigator中的组文件),然后使用代码来浏览它。 但是,那么你将不得不处理其他细节,比如只浏览与当前设备匹配的文件(iPhone与iPad,非视网膜与视网膜…),所以这只会进一步改变你的情况; 你真的应该使用一个常量来声明图像的数量(或者把它放在一些PLIST文件中),然后遍历它们。

由于您在编译时提供的文件将在您的Bundle中 – 一旦编译为数字签名,就不能被修改 – 一旦应用程序被编译,图像数量将永远不会改变。 (这不像是如果你使用的文件目录和启用iTunes文件共享或任何,让用户自己添加图像;-))

如果你的目标是iOS 7+,那么不需要。 Xcode将把这些文件打包成一个你不能直接访问的专有格式(.car)。

可以使用imageNamed: methods,也可以不使用Image Catalogs来直接访问需要访问的文件。

作为@AliSoftwarebuild议你可以存储所有的资产图像plist和访问他们以后的更多细节, 请参阅这里