ライブラリ内のコンポーネントによって参照されるリソースを含むプライベートライブラリを作成しています。ライブラリは、CocoaPodsを使用するアプリと共有されます。ライブラリの.podspecに、次のような行を含めました。
s.resource_bundles = {'IXMapKitResources' => ['IXMapKit/Resources/*']}
バンドル内のリソースの1つは、複数の画像セットを含むアセットカタログであり、そのうちの1つは「IXMKAnnotationIcons-Normal-Accident」と呼ばれます。次のコードはnilを返します。
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;
}
}
resourcesキーワードを説明するCocoaPods Webページ には次の警告があります。
リソース属性を使用して名前の衝突が発生する可能性があるため、ライブラリ開発者はリソースバンドルを採用することを強く推奨します。さらに、この属性で指定されたリソースはクライアントターゲットに直接コピーされるため、Xcodeによって最適化されません。
私はここで何をすべきか途方に暮れています。
これは、CocoaPodsやバンドルではなく、アセットカタログの問題であることが判明しました。アセットカタログから画像を移動すると、問題が解決しました。 Appleはセカンダリリソースバンドルのアセットカタログをサポートしていないようです。残念です。
例 パラマウント
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
そのフレームワーク内の任意のクラスにすることができます
どこにもリストされていない明らかな解決策は、Cocoapodsで生成されたバンドル(実際にはフォルダーは存在しません)をNSBundleとして使用することです。
試してみてください: http://blog.flaviocaetano.com/post/cocoapods-and-resource_bundles/
それは私のために働いた!
私の場合、「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
この回答はSwiftおよび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")
ポッド内のリソースバンドルを見つけることができるポッドを作成しました。 「CocoaPodsリソースバンドル」の問題が完全に解消されることを願っています。