iOS的Bundle资源束制做

在静态库的制做中,不少时候咱们的静态库也是带着文件,图片和多媒体资源的。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的类别,添加这个扩展的方法。

相关文章
相关标签/搜索