静态库怎么带图片资源
由于静态库只能放代码不能带图片资源,有两种解决方案
- 使用Framework<( ̄︶ ̄)>
- 使用bundle打包图片文件和静态库分别打包拷贝给别人
- 把图片素材传给别人
第三种方法这么坑,万一哪个文件再搞混了….所以推荐用第二种
打包Bundle
由于大部分时间引用图片都是用
[UIImage ImageNamed:name];
这种方法无法查到到我们自定义的Bundle里的图片,所以我们要写一个方法从特定的Bundle里读
从固定Bundle读图片的方法
以下是完成了一个从名称为”Resource.bundle”读取文件的示例,这样给别人静态库的时候需要新建一个为Resource.bundle的Target,添加进去图片,并且与.a一起交付给使用方.
//.h
#import <UIKit/UIKit.h>
@interface UIImage (Resource)
+ (UIImage *)resourceImageNamed:(NSString *)name;
@end
/.m
#import "UIImage+Resource.h"
@implementation UIImage (Resource)
+ (UIImage *)resourceImageNamed:(NSString *)name{
//先从默认目录里读
UIImage *imageFromMainBundle = [UIImage imageNamed:name];
if (imageFromMainBundle) {
return imageFromMainBundle;
}
//读不到再去Bundle里读
//此处Scale是判断图片是@2x还是@3x
NSInteger scale = (NSInteger)[[UIScreen mainScreen] scale];
for (NSInteger i = scale; i >= 1; i--) {
NSString *filepath = [self getImagePath:name scale:i];
UIImage *tempImage = [UIImage imageWithContentsOfFile:filepath];
if (tempImage) {
return tempImage;
}
}
return nil;
}
+ (NSString *)getImagePath:(NSString *)name scale:(NSInteger)scale{
NSURL *bundleUrl = [[NSBundle mainBundle] URLForResource:@"Resource" withExtension:@"bundle"];
NSBundle *customBundle = [NSBundle bundleWithURL:bundleUrl];
NSString *bundlePath = [customBundle bundlePath];
NSString *imgPath = [bundlePath stringByAppendingPathComponent:name];
NSString *pathExtension = [imgPath pathExtension];
//没有后缀加上PNG后缀
if (!pathExtension || pathExtension.length == 0) {
pathExtension = @"png";
}
//Scale是根据屏幕不同选择使用@2x还是@3x的图片
NSString *imageName = nil;
if (scale == 1) {
imageName = [NSString stringWithFormat:@"%@.%@", [[imgPath lastPathComponent] stringByDeletingPathExtension], pathExtension];
}
else {
imageName = [NSString stringWithFormat:@"%@@%ldx.%@", [[imgPath lastPathComponent] stringByDeletingPathExtension], (long)scale, pathExtension];
}
//返回删掉旧名称加上新名称的路径
return [[imgPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:imageName];
}
@end
建立iOS的Bundle
由于Add Target里iOS下并没有Bundle,所以我们要从OS X创建,然后修改Build Setting两项
- Base SDK 改成Lastest iOS
这里是指定为iOS的Bundle,否则是OS X用的
- Combine High Resolution Artwork 或 COMBINE_HIDPI_IMAGES
这两项一个是OSX下的名字,一个是iOS下的名字,改为NO才可以存图片,不然存进去是tiff