最近公司在做組件化,在處理圖片的時候,遇到一些問題,所以記錄一下!組件化圖片有兩種處理方式,第一種是直接創(chuàng)建一個.bundle文件夾,(直接創(chuàng)建一個空文件夾,改名.bundle,然后將圖片拖進去,但是這樣有不好的地方是,沒法適配2x,3X圖片)
podspec文件里設(shè)置
s.resource_bundles = {
?? ? 'MyOrderModule' => ['MyOrderModule/Assets/MyOrderModule.bundle']
? ?}
這樣會有兩層bundle,因為外層就會生成一個bundle
+(UIImage*)getImageWithImageName:(NSString *)imageNamebundle:(NSString*)bundleNametargetClass:(Class)targetClass{
? ? NSIntegerscale = [[UIScreenmainScreen] scale];
? ? NSBundle*bundle = [NSBundlebundleForClass:targetClass];
? ? NSURL*url = [bundleURLForResource:bundleNamewithExtension:@"bundle"];
? ? NSBundle*targetBundle = [NSBundlebundleWithURL:url];
? ? NSString*imgName = [NSStringstringWithFormat:@"%@@%zdx.png",imageName,scale];
? ? UIImage *image = [UIImage imageNamed:imgName inBundle:targetBundle compatibleWithTraitCollection:nil];
? ? return (image)? (image):(([UIImage imageNamed:imgName inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil])?([UIImage imageNamed:imgName inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]):([UIImage new]));
}
調(diào)用的地方使用
?UIImage *iamage = [self getImageWithImageName:@"aaa" bundle:@"'MyOrderModule.bundle/MyOrderModule" targetClass:[self class]];
第一個是podspec,前面寫的bundle名字 后面的是工程里放圖片的bundle名字??targetClass 名字一定要和bundle在同一個組件內(nèi),否則會取不到圖片
2.第二種方式是Assets文件夾里直接放入Assets.xcassets(自己創(chuàng)建一個Assets,隨便起名字)
修改.podspec文件如下:
s.resource_bundles = {
????'MyOrderModule' => ?['MyOrderModule/Assets/Assets.xcassets']
??}
然后pod install
就會看到多了一個Resources文件夾,里面放著Assets文件
- (UIImage*)getImageWithImageName:(NSString*)imageNamebundleName:(NSString*)bundleNametargetClass:(Class)targetClass{
? ? NSBundle*bundle = [NSBundlebundleForClass:targetClass];
? ? NSURL*url = [bundleURLForResource:bundleNamewithExtension:@"bundle"];
? ? NSBundle*targetBundle = [NSBundlebundleWithURL:url];
? ? UIImage *image = [UIImage imageNamed:imageName inBundle:targetBundle compatibleWithTraitCollection:nil];
? ? return image?image:[UIImage imageNamed:imageName inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil];
}
外面使用?
?UIImage *iamage = [self getImageWithImageName:@"aaa" bundle:@"'MyOrderModule" targetClass:[self class]];
這個是只會生成一個bundle,就是podspec里面設(shè)置的那個bundle