Ответ 1
Это оказывается проблемой для каталогов активов, а не для CocoaPods или пакетов. Перемещение изображений из каталога активов решило проблему. Похоже, что Apple не поддерживает каталоги активов во вторичных пакетах ресурсов. Жалость.
Я создаю частную библиотеку, которая включает ресурсы, на которые ссылаются компоненты в библиотеке. Библиотека используется совместно с приложениями с использованием CocoaPods. В .podspec для библиотеки я включил такую строку:
s.resource_bundles = {'IXMapKitResources' => ['IXMapKit/Resources/*']}
Один из ресурсов в комплекте - это каталог активов с несколькими наборами изображений, один из которых называется "IXMKAnnotationIcons-Normal-Accident". Следующий код возвращает нуль:
UIImage * image = [UIImage imageNamed: @"IXMKAnnotationIcons-Normal-Accident"];
Я нашел статью на mokacoding.com, описывающую загрузку шрифтов из модуля, но это не сработало для меня:
- (UIImage *) ixmk_imageNamed: (NSString *) name
{
NSString * IXMKResourceBundleName = @"IXMapKitResources.bundle";
NSString * resourceName = [NSString stringWithFormat: @"%@/%@", IXMKResourceBundleName, name];
NSString * imageTypeString = [self ixmk_stringForImageType: imageType];
NSURL * url = [[NSBundle mainBundle] URLForResource: resourceName withExtension: imageTypeString];
NSData * imageData = [NSData dataWithContentsOfURL: url];
if (imageData != nil)
{
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef) imageData);
CGImageRef imageRef = [self ixmk_imageFromDataProvider: provider imageType: imageType];
UIImage * image = [UIImage imageWithCGImage: imageRef];
CFRelease(imageRef);
CFRelease(provider);
return image;
}
else
{
return nil;
}
}
Веб-страница CocoaPods, описывающая ключевое слово ресурса, имеет следующее предупреждение:
Мы настоятельно рекомендуем рекомендовать разработчикам библиотеки, чтобы принять пакеты ресурсов как могут возникнуть столкновения имен с использованием атрибута ресурсов. более того ресурсы, указанные с этим атрибутом, копируются непосредственно в клиента, поэтому они не оптимизированы Xcode.
Я не понимаю, что делать здесь.
Это оказывается проблемой для каталогов активов, а не для CocoaPods или пакетов. Перемещение изображений из каталога активов решило проблему. Похоже, что Apple не поддерживает каталоги активов во вторичных пакетах ресурсов. Жалость.
Очевидным решением, которое нигде не было указано, является использование созданного Cocoapods пакета (которого папка фактически не существует) как NSBundle:
попробуйте: http://blog.flaviocaetano.com/post/cocoapods-and-resource_bundles/
это сработало для меня!
Например Paramount
podspec
s.resource_bundle = {
'Paramount' => ['Sources/Paramount.bundle/*.png']
}
swift
public extension UIImage {
static func make(name: String) -> UIImage? {
let bundle = NSBundle(forClass: Paramount.Toolbar.self)
return UIImage(named: "Paramount.bundle/\(name)", inBundle: bundle, compatibleWithTraitCollection: nil)
}
}
Здесь Paramount.Toolbar.self
может быть любой класс в этой структуре
Что касается меня, мне пришлось добавить "s.resources" в .podspec. До этого не было.
Только s.resource_bundles были установлены следующим образом: "BPPicker/Assets/.", также изменили его на "BPPicker/Assets/*".
#
# Be sure to run `pod lib lint BPPicker.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'BPPicker'
s.version = '0.1.11'
s.summary = 'This is the imito Body Part Picker.'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://bitbucket.org/imito/bppicker'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Ievgen Naloiko' => '[email protected]' }
s.source = { :git => 'https://[email protected]/imito/bppicker.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '9.0'
s.source_files = 'BPPicker/Classes/**/*'
s.resource_bundles = {
'BPPicker' => ['BPPicker/Assets/*']
}
s.resources = "BPPicker/**/*.{png,json}"
s.frameworks = 'UIKit'
s.dependency 'ObjectMapper'
end
Я сделал блок, который может найти пакеты ресурсов в контейнерах. Я надеюсь, что это закончит проблему "Ресурсный пакет CocoaPods" раз и навсегда.
Этот ответ работает с Swift3 и Swift4.
Создайте функцию под каталогом pod в файл.
func loadImageBundle(named imageName:String) -> UIImage? {
let podBundle = Bundle(for: self.classForCoder)
if let bundleURL = podBundle.url(forResource: "Update with directory name", withExtension: "bundle")
{
let imageBundel = Bundle(url:bundleURL )
let image = UIImage(named: imageName, in: imageBundel, compatibleWith: nil)
return image
}
return nil
}
Использование
imageView.image = loadImageBundle(named: "imagefile")