将资源文件打成bundle

封装SDK等组件时,为了不在宿主项目中额外配置资源文件,通常将SDK所用资源文件打成.bundle文件。

创建Bundle

1.选中工程目录。点击添加Target
  1. 选择macOS,搜索bundle,选择Bundle,下一步。
  2. 设置bundle名字
  3. 选中bundle的Target,在Build settings 下搜索 combine, 将COMBINE_HIDPI_IMAGES值改为No。(不然打包成bundle中的图片会编程.tiff格式)
  4. 新建一个分组,用来装需要打包的资源文件

将资源文件放入Bundle

  1. 将外部的资源文件拖入文件夹内,并选择Target为创建的Bundle
  2. 将资源文件导入后的结构

生成.bundle文件

  1. 选中Bundel工程,编译。
  2. 点击Product中Show Build Folder in Finder
  3. 在Debug内有生成的.bundle文件
  4. 显示包内容,可以检查一下生成的bundle文件中是否包含所需资源文件

使用.bundle

  1. 没问题了就可以将.bundle文件拖入项目中。这次用的Target是宿主,所以选择宿主Target。
  2. 使用
    2.1 OC
@interface UIImage (BundleImage)
+ (UIImage *)loadBundleImage:(NSString *)imageName;
@end

@implementation UIImage (BundleImage)

+ (UIImage *)loadBundleImage:(NSString *)imageName {
    
    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"TestAppBundle" ofType:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
    return [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil];
    
}

@end

调用:

UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 18, 18)];
img.image = [UIImage loadBundleImage:@"arrowLeft"];
[self.view addSubview:img];

2.2 Swift

class ChatbotBundle {
    static func getZKSmartBundle() -> Bundle {
        if let bundleURL = Bundle.main.url(forResource: "ChatbotBundle", withExtension: "bundle"),
           let bundle = Bundle(url: bundleURL) {
            return bundle
        } else {
            fatalError("ZKSmart.bundle not found.")
        }
    }
}

extension UIImage {
    static func loadBundleImage(_ name: String) -> UIImage {
        return UIImage(named: name, in: ChatbotBundle.getZKSmartBundle(), compatibleWith: nil)!
    }
}

调用:

lazy var backBtn: UIButton = {
  let button = UIButton(type: .custom)
  button.backgroundColor = .clear
  button.setImage(UIImage.loadBundleImage("arrowLeft"), for: .normal)
  return button
}()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容