在静态库的制做中,不少时候咱们的静态库也是带着文件,图片和多媒体资源的。android
若只是直接加入到项目中也是能够,可是,考虑到方便管理(方便插件使用者的管理),咱们但愿把插件的资源文件打成一个包来管理。api
固然有人也会说,那我直接在项目中新建一个group来管理也是同样的容易。框架
此刻,我只能很装逼的说一句:这样,显得专业点么~。url
你看three20啊,银联啊等等。总体项目目录相对看起来简约点。spa
bundle的制做。插件
1.新建一个文件夹,而后将文件夹命名修改你要的文件夹名,而且加上后缀:xxx.bundle。code
而后你就会看到文件夹变成了一个咱们常见的bundle样式的文件夹。对象
2.加入文件资源,此时为了方便管理,咱们最好如今里面新建3种资源的文件夹blog
固然了,不建立也不要紧,可是这个images文件夹最好建立,由于,咱们会把全部的图片资源放在这里来方便管理。three
而后添加点图片到images中。
3.把bundle文件加入到项目中
4.读取和使用文件。
UILabel *la = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 50, 50)]; la.text = @"老王"; NSString *image_url = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"nono.bundle/images/android.png"]; la.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:image_url]];
此时,由于之前咱们获取UIImage对象大部分都是直接使用的api为:
[UIImage imageNamed:@"android.png"]
方法其实也是经过相对路径给咱们找到了图片资源。
可是在咱们本身制做的bundle文件夹的图片资源则不能使用该方法来找到了。
咱们每次指定图片须要传入一个很长的地址,以为比较麻烦。可是咱们会发现,图片都是在xxx.bundle/images下面。
那么咱们也可使用宏或是类别来定义一个方法来简单到和[UIImage imageNamed:@"android.png"]同样。只需一个文件名就好了。
宏的表现能够参考three20下的
TTIMAGE(@"bundle://Three20.bundle/images/backIcon.png")
返回的就是一个image对象。
three20框架中实际上是使用了scheme的思想,bundle://和document;//来加载不一样文件夹下的资源。
加载自定义bundle文件夹下的图片最后就是根据
先获取应用的绝对路径
mainbundle_path = [NSBundlemainBundle] resourcePath] ;
而后截取了bundle://后面的path 和mainbundle_path组装成最后的地址。
对于咱们,简单的实现能够直接使用类别
1 -(UIImage*) imagesNamedFromCustomBundle:(NSString *)name { 2 NSString *main_images_dir_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"nono.bundle/images"]; 3 // NSAssert(main_images_dir_path, @"main_images_dir_path is null"); 4 NSString *image_path = [main_images_dir_path stringByAppendingPathComponent:name]; 5 return [UIImage imageWithContentsOfFile:image_path]; 6 }
建立一个UIImage的类别,添加这个扩展的方法。