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

Ios 我可以访问文件系统上的xcassets目录吗?,ios,xcode,cocoa-touch,asset-catalog,xcasset,Ios,Xcode,Cocoa Touch,Asset Catalog,Xcasset,我想动态加载xcassets目录中的所有图像。文件名为StockPhoto,其中#是列表中的数字。如果我可以在运行时访问我的StockPhotos.xcsets以计算目录中的所有文件,那么我就不必在每次添加新的库存照片时手动加载这些文件 如果这个问题还有其他解决方案,我对此持开放态度,但我也非常好奇xcassets是如何被文件系统处理的——它们是仅仅引用一组文件,还是实际上是它们自己的目录。关于这方面的信息很少。如果您的目标是iOS 7+,那么没有。Xcode会将文件打包成您无法直接访问的专有格

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


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

如果您的目标是iOS 7+,那么没有。Xcode会将文件打包成您无法直接访问的专有格式(.car)


可以使用
imageNamed:
方法,也可以不对需要直接访问的文件使用图像目录。

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

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

  • 它将生成与您在不使用资产目录的情况下必须生成的图像文件集相同的图像文件集,即
    .png
    @2x.png
    ~ipad.png
    ~ipad@2x.png
    等等,对于xcassets的每个映像集
如果您的“部署目标”是iOS7或更高版本(意味着您的应用程序只能在iOS7+上运行)

  • 它将在最后一个捆绑包中生成一个大的
    .car
    文件(我没有真正查找该文件是否是sqlite3 Database或某些专有格式或诸如此类的文件,但谁在乎呢,您无论如何都不应该操纵它)。这个大的
    .car
    文件包含所有图像,以及它们提供的所有变体,甚至还有切片信息(如果您确实切片了其中一些图像以进行平铺,或者使用资产目录编辑器中提供的工具将其用作9面片图像)

无论结果如何,你都不应该/不应该像那样深入挖掘捆绑包的内部细节。
.car
文件的格式甚至可能从一个iOS版本更改为另一个版本(谁知道呢?这毕竟是内部细节,我们不应该处理),所以不要将逻辑建立在它之上

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

由于您在编译时提供的文件将在您的捆绑包中—编译后无法更改,因为它是数字签名的—无论如何,一旦编译应用程序,图像的数量将永远不会更改。(这与您使用Documents目录并启用iTunes文件共享或其他功能,让用户自己添加图像不同;-))

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

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


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

正如@AliSoftware所建议的那样,你可以将所有资产图像存储到plist中,稍后再访问它们以获取更多详细信息。

这正是我所担心的。太糟糕了。因此,如果我用这些照片的文件夹构建应用程序,它会被放置在应用程序的主目录、文档或库中吗?以上都没有。它将像任何内置资源一样位于主捆绑包中。这就是我所说的“家”的意思,但我应该澄清一下。谢谢你的指点,马特,没问题。我已经完成了您所描述的事情(随着应用程序开发的进行,将越来越多的图像添加到文件夹中,并在应用程序运行时通过查看文件夹动态获取图像),因此我知道这可以通过这种方式完成。