Могу ли я получить доступ к каталогу xcassets в файловой системе?

Я хотел бы динамически загружать все изображения в каталог xcassets. Файлы называются StockPhoto#, где # — номер в списке. Если я смогу получить доступ к моим StockPhotos.xcassets во время выполнения, чтобы подсчитать все файлы в каталоге, мне не придется вручную загружать файлы каждый раз, когда я добавляю новые стоковые фотографии.

Если есть другие решения этой проблемы, я открыт для этого, но мне также очень любопытно, как xcassets обрабатываются файловой системой - являются ли они просто ссылкой на набор файлов или на самом деле их собственный каталог. Информация об этом скудная.


person user    schedule 20.03.2014    source источник


Ответы (4)


Если есть другие решения этой проблемы, я открыт для этого

Проблема в том, что во время выполнения каталог ресурсов не анализируется: это не «вещь», которую вы можете «увидеть» в том, что касается Objective-C и Cocoa Touch.

Обычное решение такого рода проблем — перетащить папку, полную изображений, в ваш проект в самом начале, а когда вы это сделаете, выберите в диалоговом окне «Создавать ссылки на папки для любых добавленных папок» — не «Создавать группы для любых добавленных папок». В результате папка копируется в пакет приложения, и теперь вы можете использовать обычные методы файловой системы, чтобы сказать «каждый файл в этой папке».

person matt    schedule 20.03.2014
comment
Вот чего я боялся. Очень жаль. Итак, если я создам приложение с папкой для этих фотографий, оно будет помещено в домашний каталог приложения, документы или библиотеку? - person user; 20.03.2014
comment
Ни один из вышеперечисленных. Он будет в основном комплекте, как и любой встроенный ресурс. - person matt; 20.03.2014
comment
Это то, что я имел в виду под домом, но я должен был уточнить. Спасибо за подсказки, Мэтт. - person user; 20.03.2014
comment
Без проблем. Я сделал именно то, что вы описываете (добавляя все больше и больше изображений в папку по мере разработки приложения и динамически извлекая их по мере запуска приложения, просматривая папку), поэтому я знаю, что это можно сделать таким образом. - person matt; 20.03.2014

После компиляции вашего проекта iOS xcassets компилируются для создания либо файлов изображений, либо проприетарного .car файла. В последнем случае изображения не будут храниться в каталоге, который вы можете просматривать.

Если ваша цель развертывания меньше, чем iOS7 (это означает, что ваше приложение по-прежнему сможет работать на iOS6)

  • Он создаст тот же набор файлов изображений, который вам пришлось бы создать без использования каталога активов, а именно <YourImageName>.png, <YourImageName>@2x.png, <YourImageName>~ipad.png, <YourImageName>[email protected] и т. д., для каждого набора изображений ваших xcassets.

Если ваша цель развертывания — iOS7 или выше (это означает, что ваше приложение сможет работать только на iOS7+)

  • Он создаст один большой файл .car в финальном пакете (я действительно не искал, был ли этот файл на самом деле базой данных sqlite3 или каким-то проприетарным форматом или чем-то еще, но кого это волнует, вы все равно не должны манипулировать им). Этот большой файл .car содержит все изображения со всеми их вариантами и даже с информацией о нарезке (если вы нарезали некоторые из них для мозаичного размещения или использовали их в качестве изображений с 9 патчами с помощью инструмента, предусмотренного для этого в редакторе каталога ресурсов). )

Каким бы ни был полученный результат, вы не должны / не должны так копаться во внутренних деталях вашего пакета. Формат файла .car может даже меняться от одной версии iOS к другой (кто знает? в конце концов, это внутренние детали, с которыми мы не должны иметь дело), ​​поэтому не основывайте на этом свою логику.

[EDIT]: Если вам необходимо иметь каталог с вашим набором изображений в конце компиляции, вы можете вместо этого использовать ссылку на папку (ссылку на реальную папку в Finder, как в отличие от группы Xcode как только групповые файлы в навигаторе проектов Xcode), затем используйте код для его просмотра. Но тогда вам придется иметь дело с другими деталями, например, просматривать только те файлы, которые соответствуют текущему устройству (iPhone или iPad, не-retina или retina…), так что это только усугубит проблему в вашем случае; вам действительно следует использовать константу где-нибудь, чтобы объявить количество изображений (или поместить это, например, в какой-нибудь файл PLIST) и перебрать их.

Поскольку файлы, которые вы предоставляете во время компиляции, будут в вашем пакете, который нельзя изменить после компиляции, поскольку он имеет цифровую подпись, количество изображений никогда не изменится после компиляции приложения. (Это не похоже на то, если бы вы использовали каталог «Документы» и включили общий доступ к файлам iTunes или что-то еще, позволяя пользователю самому добавлять изображения ;-))

person AliSoftware    schedule 20.03.2014

Если вы ориентируетесь на iOS 7+, то нет. Xcode упакует файлы в проприетарный формат (.car), к которому у вас нет прямого доступа.

Либо используйте методы imageNamed:, либо не используйте каталоги образов для файлов, к которым вам нужен прямой доступ.

person Dave Wood    schedule 20.03.2014

как предлагает @AliSoftware, вы можете сохранить все изображения ресурсов в plist и получить к ним доступ позже для получения более подробной информации см. здесь

person Meghs Dhameliya    schedule 06.10.2016