【问题标题】:Can I access an xcassets directory on the filesystem?我可以访问文件系统上的 xcassets 目录吗?
【发布时间】:2014-04-26 14:01:51
【问题描述】:

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

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

【问题讨论】:

    标签: ios xcode cocoa-touch asset-catalog xcasset


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      • 它将为您的每个图像集生成相同的图像文件集,即<YourImageName>.png<YourImageName>@2x.png<YourImageName>~ipad.png<YourImageName>~ipad@2x.png 等等。 xcassets。

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

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

        @AliSoftware 建议您可以将所有资产图像存储到 plist 并稍后访问它们以获取更多详细信息see here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-26
          • 2014-08-14
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 2011-01-28
          • 1970-01-01
          相关资源
          最近更新 更多