从CocoaPods资源包加载图像

Dav*_*ter 20 iphone xcode objective-c ios cocoapods

我正在创建一个私有库,其中包含库中组件引用的资源.该库与使用CocoaPods的应用程序共享.在库的.podspec中,我包含了这样一行:

s.resource_bundles = {'IXMapKitResources' => ['IXMapKit/Resources/*']}
Run Code Online (Sandbox Code Playgroud)

捆绑包中的一个资源是具有多个图像集的资产目录,其中一个称为"IXMKAnnotationIcons-Normal-Accident".以下代码返回nil:

UIImage * image = [UIImage imageNamed: @"IXMKAnnotationIcons-Normal-Accident"];
Run Code Online (Sandbox Code Playgroud)

在mokacoding.com上发现了一篇文章,描述了如何从pod中加载字体,但这对我不起作用:

- (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;
    }
}
Run Code Online (Sandbox Code Playgroud)

描述resources关键字CocoaPods网页有以下警告:

我们强烈建议库开发人员采用资源包,因为可以使用resources属性进行名称冲突.此外,使用此属性指定的资源将直接复制到客户端目标,因此Xcode不会优化它们.

我不知道该怎么做.

Dav*_*ter 12

事实证明这是资产目录的问题,而不是CocoaPods或bundle.将图像移出资产目录可以解决问题.看起来Apple不支持辅助资源包中的资产目录.可怜.

  • 你有更多的信息吗? (4认同)

onm*_*133 6

例如派拉蒙

podspec

s.resource_bundle = {
    'Paramount' => ['Sources/Paramount.bundle/*.png']
}
Run Code Online (Sandbox Code Playgroud)

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

这里Paramount.Toolbar.self可以是该框架中的任何类