Создание библиотеки 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];