iOS8出来很久了,由于生意和工作的原因,一直没有仔细研究,最近空了下来,写一下最近碰到的一个小坑,希望对大家在NSBundle这一个东西上有所帮助,看清楚mainBundle中访问资源和自定义Bundle中访问资源的差别所在。
PS:本文涉及到控件的摆放,不清楚Auto Layout的同学,可以自已看一下苹果的官方文档和WWDC的视频,百度出来的这些教程,我实在受不了。。。最后还是自已硬啃英文文档才理解的。
请大家仔细理解标红的代码。
demo下载链接:http://pan.baidu.com/s/1kT9wUNl
进入正题:
一、新建一个Single View Application工程,点击Next
二、项目名称TestBundle,主要演示mainBundle和自定义Bundle的区别。
三、准备两组6张图,M表示Mainbundle加载的图片,C表示自定义Bundle加载的图片,分别命名为M.png,[email protected],[email protected]和C.png,[email protected],[email protected],
M和C的1倍尺寸为60*60,@2x和@3x尺寸对应放大倍数即可
大家如果没有图的话,可以直接下载demo压缩包并解压,找到上述6张图片。
四、将图片放入对应的文件夹中,并添加到项目中,新建Group,命名为images,然后将上述图片添加到images这个组,如下图
六、ViewController.h中,将UIImageView连线并命名为imageMainBundle
@property (weak, nonatomic) IBOutlet UIImageView *imageMainBundle;
然后在ViewController.m中编辑viewDidLoad函数
– (void)viewDidLoad {
[super viewDidLoad];
// imageNamed:这个方法加载图片会有缓存,不适于大图片加截,建议频繁加载同一个小图片的操作时使用。
// UIImage *imgM = [UIImage imageNamed:@”M”];
// [_imageMainBundle setImage:imgM];
// 加载Mainbundle中的图片,推荐使用imageWithContentsOfFile:这个方法来加载图片,至于区别,请自行百度
NSString *strM = [[NSBundle mainBundle] pathForResource:@”M” ofType:@”png”];
UIImage *imgM = [UIImage imageWithContentsOfFile:strM];
[_imageMainBundle setImage:imgM];
}
运行后的效果图如下:
七、接下来,自定义一个Bundle命名为Resources.bundle,并在Bundle中添加一个images的文件夹,然后把C.png等三张图片加入到该文件夹中。
八、删掉TestBundle文件夹中的C.png/[email protected]/[email protected]以及项目中的三张图片,项目中如下图所示
九、为了区别之前的mainbundle中的图片,我们再在storyboard上添加一个label和一个UIImageView,如下图:
Autolayout这一块,需要大家自已去体会理解,我自已也花了1天的时间看苹果的官方文档,另外专门花了1天的时间来理解、消化、实践。
十、连线ViewController.h,并声明一个imageCustomBundle的UIImageView变量。如下图:
@property (weak, nonatomic) IBOutlet UIImageView *imageCustomBundle;
十一、ViewController.m
// 加载自定义名称为Resources.bundle中对应images文件夹中的图片
// 思路:从mainbundle中获取resources.bundle
NSString *strResourcesBundle = [[NSBundle mainBundle] pathForResource:@”Resources” ofType:@”bundle”];
// 找到对应images夹下的图片
NSString *strC = [[NSBundle bundleWithPath:strResourcesBundle] pathForResource:@”C” ofType:@”png” inDirectory:@”images”];
UIImage *imgC = [UIImage imageWithContentsOfFile:strC];
[_imageCustomBundle setImage:imgC];
执行后的效果: