Как я могу загрузить изображение из Assets.car (скомпилированная версия xcassets) в NSBundle? (без использования CocoaPods)

Мы получаем такие сообщения об ошибках:

Не удалось загрузить изображение «iconStatus», указанное из пера в пакете с идентификатором «com.company.OurResourceBundle».

По сути, мы помещаем кучу изображений в папку xcassets (которая работает для случаев, не загруженных пакетом). Файлы xcassets и nib упакованы в пакет ресурсов.

Когда приложение запускается,

  1. uiimageview в файле пера не может загрузить изображения с указанным выше сообщением об ошибке.
  2. [UIImage imageNamed: @ "OurResourceBundle.bundle / iconStatus"] возвращает ноль

Вопрос связан с "Как я могу загрузить изображение из Assets.car (скомпилированная версия xcassets) в NSBundle?", но мы не используем CocoaPods.


person Tom Fishman    schedule 04.04.2014    source источник
comment
По сути, ответ будет таким же, как и на вопрос, на который вы ссылаетесь. imageNamed: загружается только из основного пакета, поэтому вам нужно будет создать категорию, которая выполняет все необходимые действия для загрузки изображений из другого пакета.   -  person David Berry    schedule 04.04.2014
comment
Я попробовал, но ничего не вышло. Есть что-то особенное для комплектующих xcasset   -  person Tom Fishman    schedule 05.04.2014
comment
Как получить скомпилированный *.car файл? Судя по моему небольшому опыту, все *.xcassets изображения просто копируются (с собственным именем) в папку *.app.   -  person Rivera    schedule 07.04.2014
comment
Я добавил .xcassets (папку на жестком диске) в раздел Copy Bundle Resource для целевого объекта Bundle статической библиотеки. Xcode автоматически создает файл .car в пакете.   -  person Tom Fishman    schedule 07.04.2014
comment
Эта ссылка может помочь: stackoverflow.com/questions/10998544/ Попробуйте что-нибудь вроде: - [UIImage imageNamed: @iconStatus]; или [UIImage imageNamed: @ iconStatus.png];   -  person Ricky    schedule 05.05.2014
comment
Я не знал о скомпилированном xcasset. По моему опыту, изображения просто получают правильные имена и копируют в корень основного пакета (корневую папку .app).   -  person Rivera    schedule 09.05.2014
comment
Если вы установите iOS Deployment Target своего проекта на версии iOS до 7.0, файл xcassets не будет скомпилирован в .car. Я протестировал его, и если вам не повредит сменить iOS Deployment Target на iOS 6, это может быть решением.   -  person Ge Liu    schedule 23.12.2015


Ответы (3)


В iOS 7 невозможно загружать изображения из любого файла .car, кроме того, который Xcode компилирует в основной пакет. Это подтвердил разработчик Apple на странице https://devforums.apple.com/message/968859#968859:

К сожалению, невозможно загрузить изображения из любого автомобильного файла, кроме того, который Xcode компилирует в ваш основной пакет, так как + imageNamed: не принимает параметр пакета, который необходим для этого (и даже тогда он будет только иметь возможность открывать единый каталог активов в едином пакете).

В iOS 8 есть новый метод, который позволяет делать то, что вы хотите:

+ (UIImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle
    compatibleWithTraitCollection:(UITraitCollection *)traitCollection
person torrey.lyons    schedule 10.10.2014
comment
У меня это не работает. Похоже, этот метод считывает только изображение непосредственно под пакетом, но не изображение в xcasset внутри этого пакета :( - person Hlung; 27.03.2015
comment
Я нигде не могу найти решение для этого, я должен просто сделать все изображения отдельным файлом из xcasset? - person Tj3n; 29.09.2016
comment
Вот что я в итоге сделал. Больно не иметь возможности использовать файлы .xcasset в пакетах, но это отлично работает, если вы просто включите свои изображения в пакет по старинке. - person torrey.lyons; 30.09.2016
comment
Но тогда я буду скучать по функциям @2x и @3x, верно? Если я это сделаю, мне нужно просто удалить @1x и @2x и оставить самый большой? В IOS8 это возможно, но моя структура должна поддерживать iOS 7, поэтому - person Tj3n; 04.10.2016
comment
Вы можете предоставить версии изображений «@ 2x» и «@ 3x». Единственное ограничение - они должны быть названы в соответствии с соглашением об именах, и тогда они будут использоваться соответствующим образом. Например: image.png, [email protected] и [email protected]. (Нет "@ 1x" для изображения со стандартным разрешением) - person torrey.lyons; 04.10.2016

вы должны определить свой пакет

  imageView.image = UIImage(named: "iconName", in: Bundle.main, compatibleWith: nil)
person Abuzeid    schedule 21.04.2020

Я подозреваю, что если ваша папка с изображениями будет сжата в файл .car, тогда NSBundle будет знать, как искать в ней ресурсы. Попробуйте создать новый пакет из пакета ресурсов. Затем спросите у этого пакета путь к вашему изображению. Наконец, создайте изображение из этого пути. Это своего рода подход, который мы применяем при объединении ресурсов изображений и локализованных строк с нашими статическими библиотеками. Наша версия немного сложнее, поскольку автоматически обрабатывает такие вещи, как изображения @ 2x и ~ ipad, но в этом суть.

    NSBundle *myBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"your bundle" ofType:@"bundle"]];
    NSString *filePath = [myBundle pathForResource:@"icon" ofType:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:filePath];
person Brandon    schedule 05.05.2014