Создание библиотеки Cocoapod и [UIImage imageNamed:] возвращает NULL

У меня https://github.com/fulldecent/FDChessBoardView работает отлично, и теперь я начинаю проект снова с нуля с помощью pod lib create, чтобы сделать Podspec.

Существует один файл {.h ','. m '} и некоторые изображения. Изображения находятся в файловой системе в папке Pod/Assets. Ресурсы отмечены в файле podspec с помощью:

s.resource_bundles = {
  'FDChessboardView' => ['Pod/Assets/*']
}

(Я также попытался напрямую добавить эти файлы в группу Development Pods/FDChessboardView/Resources внутри XCode.)

Внутри файла реализации библиотеки мне нужно обратиться к этим изображениям. Я пробовал:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"FDChessboardView" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *imagePath = [bundle pathForResource:@"aa" ofType:@"png"];
UIImage* image = [UIImage imageWithContentsOfFile:imagePath];

Здесь imagePath установлен правильно. Этот файл существует и file подтверждает, что это PNG:

[...] aa.png: данные изображения PNG, 182 x 164, 8 бит/цвет RGBA, без чередования

Однако UIImage имеет значение NULL.

Я также пробовал:

image = [UIImage imageNamed:@"aa"];
UIImage *image = [UIImage imageNamed:@"FDChessboardView.bundle/aa.png"];
image = [UIImage imageNamed:@"aa" inBundle:bundle compatibleWithTraitCollection:nil];

Все они производят NULL.

Может ли кто-нибудь помочь мне указать правильное направление загрузки загрузочных объектов?

Спасибо!

Воля

Ответы

Ответ 1

Хорошо - я нашел решение, которое работает для меня:

В lib, который я создаю, у меня есть следующий класс: AEBubbleField.h AEBubbleView.m

У меня также есть изображение в папке Assets сгенерированной файловой структуры под названием background.png. Я хочу использовать это в своих lib файлах выше, поэтому я добавляю следующее в спецификацию pod (чтобы гарантировать, что png скопирован с моими классами lib)

s.ios.resource_bundle = { 'AEBubbleField' => 'Pod/Assets/*.png' }

Затем я могу получить доступ к изображению следующим образом:

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; // Any class in the lib can be used here, I just went for the current class
UIImage *backgroundImage = [UIImage imageNamed:@"background.png" inBundle:bundle compatibleWithTraitCollection:nil];

Это единственный способ получить изображение и использовать его. Все остальные методы, которые я попробовал, просто возвращают nil как исходный вопрос.

Ответ 2

этот ответ работает для меня.
fooobar.com/questions/382079/...

и мой быстрый код:

class func loadImage(name: String) -> UIImage? {
    let podBundle = NSBundle(forClass: MyClass.self)
    if let url = podBundle.URLForResource("MyBundleName", withExtension: "bundle") {
        let bundle = NSBundle(URL: url)
        return UIImage(named: name, inBundle: bundle, compatibleWithTraitCollection: nil)
    }
    return nil
}

Ответ 3

Если вы используете Swift 2 > , вы можете получить доступ к этому пути:

// should access the bundle for this class
let bundle = NSBundle(forClass: self.classForCoder)
// successfully loaded image
let myImageToUse = UIImage(named: "image", inBundle: bundle, compatibleWithTraitCollection: nil)

Ответ 4

Ответ Rob не работал у меня, я думаю, потому что я не изменил настройку пакета ресурсов по умолчанию в pod lib create

s.resource_bundles = {
  'PodCore' => ['Pod/Assets/*.png', 
                  'Pod/Classes/**/*.xib', 
                  'Pod/Classes/**/*.storyboard']
}

Мне удалось загрузить изображения из этого ресурсного пакета, но он должен был явно определить его.

NSString *bundleURL = [[NSBundle mainBundle] pathForResource:@"PodCore" 
                                                      ofType:@"bundle"];
NSBundle *podBundle = [NSBundle bundleWithPath:bundleURL];
UIImage *image = [UIImage imageNamed:@"home_black.png" 
                            inBundle:podBundle
       compatibleWithTraitCollection:nil];