封装SDK等组件时,为了不在宿主项目中额外配置资源文件,通常将SDK所用资源文件打成.bundle
文件。
创建Bundle
1.选中工程目录。点击添加Target- 选择macOS,搜索
bundle
,选择Bundle,下一步。 -
设置bundle名字
- 选中bundle的Target,在Build settings 下搜索
combine
, 将COMBINE_HIDPI_IMAGES
值改为No
。(不然打包成bundle中的图片会编程.tiff
格式) -
新建一个分组,用来装需要打包的资源文件
将资源文件放入Bundle
-
将外部的资源文件拖入文件夹内,并选择Target为创建的Bundle
-
将资源文件导入后的结构
生成.bundle文件
-
选中Bundel工程,编译。
-
点击Product中Show Build Folder in Finder
-
在Debug内有生成的.bundle文件
-
显示包内容,可以检查一下生成的bundle文件中是否包含所需资源文件
使用.bundle
-
没问题了就可以将.bundle文件拖入项目中。这次用的Target是宿主,所以选择宿主Target。
- 使用
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
}()