iOS8正确访问mainBundle和自定义Bundle中子文件夹资源文件NSBundle

By | 2015年8月14日

iOS8出来很久了,由于生意和工作的原因,一直没有仔细研究,最近空了下来,写一下最近碰到的一个小坑,希望对大家在NSBundle这一个东西上有所帮助,看清楚mainBundle中访问资源和自定义Bundle中访问资源的差别所在。

PS:本文涉及到控件的摆放,不清楚Auto Layout的同学,可以自已看一下苹果的官方文档和WWDC的视频,百度出来的这些教程,我实在受不了。。。最后还是自已硬啃英文文档才理解的。

请大家仔细理解标红的代码。

demo下载链接:http://pan.baidu.com/s/1kT9wUNl

进入正题:

一、新建一个Single View  Application工程,点击Next

 

新建singleview

二、项目名称TestBundle,主要演示mainBundle和自定义Bundle的区别。

输入项目名称

 

三、准备两组6张图,M表示Mainbundle加载的图片,C表示自定义Bundle加载的图片,分别命名为M.png,M@2x.png,M@3x.png和C.png,C@2x.png,C@3x.png,

M和C的1倍尺寸为60*60,@2x和@3x尺寸对应放大倍数即可

大家如果没有图的话,可以直接下载demo压缩包并解压,找到上述6张图片。

6张图片

 

四、将图片放入对应的文件夹中,并添加到项目中,新建Group,命名为images,然后将上述图片添加到images这个组,如下图

在项目中添加group并命名

 

五、Storyboard中的设置设置storyboard

 

六、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];
}

运行后的效果图如下:

效果图1

 

七、接下来,自定义一个Bundle命名为Resources.bundle,并在Bundle中添加一个images的文件夹,然后把C.png等三张图片加入到该文件夹中。

添加bundle文件

 

八、删掉TestBundle文件夹中的C.png/C@2x.png/C@3x.png以及项目中的三张图片,项目中如下图所示

project视图

 

九、为了区别之前的mainbundle中的图片,我们再在storyboard上添加一个label和一个UIImageView,如下图:

Auto Layout2

 

 

Autolayout这一块,需要大家自已去体会理解,我自已也花了1天的时间看苹果的官方文档,另外专门花了1天的时间来理解、消化、实践。

十、连线ViewController.h,并声明一个imageCustomBundle的UIImageView变量。如下图:

@property (weak, nonatomic) IBOutlet UIImageView *imageCustomBundle;

IBAction

 

十一、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];

 

执行后的效果:

效果图2

 

//  谋生广告,不喜勿看

//  淘宝店:http://appfish.taobao.com

//  主营:快速代理申请苹果开发者账号(个人、公司、企业)

//  如果觉得文章写得好,请收藏一下我们的店铺

//  如果有需要开发者账号的话,请直接和淘宝旺旺客服联系,谢谢>____<

//  我们的宗旨:我们从不刷单!