在ios开发中为了方便管理资源文件,可以使用bundle的方式来进行管理,比如kkgridview里就是把所需的图片文件全部放在一个bundle来管理的 .

切记目前iOS中只允许使用bundle管理资源文件和国际化信息,不支持代码的打包。

在xcode中只能够创建setting bundle,会默认创建一些配置文件,在xcode中无法直接删除,这也许不是我们需要的。

那么如何使用最简单的方法创建一个bundle呢?

1 创建一个文件夹

2 将该文件夹重命名为a.bundle

3 将a.bundle拖入到xcode中即可

当然这样处理之后,取图片之类的文件,使用的方法就不一样了,以取iphone_52x52.png图片为例:

NSString *bundlePath = [[NSBundle mainBundle].resourcePathstringByAppendingPathComponent:@"My.bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

UIImage *(^getBundleImage)(NSString *) = ^(NSString *n) {

return [UIImage imageWithContentsOfFile:[bundle pathForResource:nofType:@"png"]];

};

UIImage *myImg = getBundleImage(@"iphone_52x52");

代码是蛮长一块,为了方便使用,我们可以写一个UIImage的类别,在类别中加入此方法,这样用起来就简单多了:

- (UIImage *)imagesNamedFromCustomBundle:(NSString *)imgName

{

NSString *bundlePath = [[NSBundle mainBundle].resourcePathstringByAppendingPathComponent:@"My.bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

NSString *img_path = [bundle pathForResource:imgName ofType:@"png"];

return [UIImage imageWithContentsOfFile:img_path];

}

调用方式:

UIImage * img  = [self imagesNamedFromCustomBundle:@"iphone_52x52"];

测试了下,发现一点小问题,为了兼容retina屏,有iphone_52x52.png和iphone_52x52@2x.png,两张图片,

当我们用UIImage * img = [UIImage imageNamed:@"iphone_52x52"];这种方式取图片时,会根据你是不是retina屏

来返回不同的图片,如果这两张图你只提供了一张,那么也可以正常运行,只是图片会按比例进行拉伸。

在测试上面的imagesNamedFromCustomBundle方法时,提供两张图片和只提供iphone_52x52.png时,两种屏下面都正常,但如果只提供了iphone_52x52@2x.png这张图片,那么无论是普通屏还是retina屏,都会找不到图片。

调试分析了下,是在[bundle pathForResource:imgName ofType:@"png"];这里出了问题,返回的path都是nil,把上面的方法改成下面这样:

- (UIImage *)imagesNamedFromCustomBundle:(NSString *)imgName

{

NSString *bundlePath = [[NSBundle mainBundle].resourcePathstringByAppendingPathComponent:@"testLocalVirable.bundle"];

NSString *img_path = [bundlePath stringByAppendingPathComponent:imgName];

return [UIImage imageWithContentsOfFile:img_path];

}

调用方式改成:UIImage * img  = [self imagesNamedFromCustomBundle:@"iphone_52x52.png"];//把扩展名加上了

这样在来测试,retina屏正常了,普通屏还是找不到图片。

分析了半天也没找到解决方法,知识还是有限啊,看来要去请教下大牛才行了;

现阶段的处理方法就是别偷懒,提供完整的两张图片就ok了。

这里有老外的一篇讲Resource Bundles的文章:http://www.cocoanetics.com/2012/05/resource-bundles/

粗略过了一遍,有些地方也没看懂,记下来,有空花时间好好看看。

bundle的本质就是一个文件夹。当然在iOS中还可以干很多事情,详细资料请参考:

https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html#//apple_ref/doc/uid/10000123i-CH100-SW7

ios创建bundle的图片资源文件(转)的更多相关文章

  1. ios创建的sqlite数据库文件如何从ios模拟器中导出

    为了验证数据库的结构,有的时候需要使用一些管理工具来直接查看sqlite数据库的内容,在windows下有sqlite3的专用工具下载,而在ios下也可以使用火狐浏览器的插件sqlitemanager ...

  2. ios 创建自己的.a文件

    1:首先创建个 静态工程(Cocoa Touch Static Library); 方法名字,一定要暴露在.h文件中, 2:分别在模拟器环境和真机环境下 Analyze (shift+command+ ...

  3. ios 创建和绘画pdf文件 -转

    转自:http://blog.csdn.net/ant1239/article/details/7761676 本方法为项目中画pdf的一个方法,画pdf,一共分为几步,1,获取地址,有两种获取地址方 ...

  4. iOS - 集成Bundle资源文件包

    1.Bundle 文件 Bundle 文件,简单理解,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是 ...

  5. IOS源码封装成.bundle和.a文件,以及加入xib的具体方法,翻遍网络,仅此一家完美翻译!! IOS7!!(3) 完美结局

    以上翻译有误解之处,现在简单做法如下: 经过深入研究,才感觉明白了内部机制,现在简单介绍于下,主要步骤:xcode5 创建库项目,删掉测试文件和默认创建的类,添加viewController类带xib ...

  6. ios开发证书,描述文件,bundle ID的关系

    苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布证书(又叫"生产证书"),开发描述文 ...

  7. 【转】ios开发证书,描述文件,bundle ID的关系

    ios开发证书,描述文件,bundle ID的关系   苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布 ...

  8. ios私钥证书和profile文件的创建方法

    做过ios开发的朋友们,对ios私钥证书和profile文件(描述文件)可能并不陌生,可以通过mac电脑来创建,但是,假如我们是用H5开发工具开发的,我们没有mac电脑怎么创建证书呢? 目前H5打包用 ...

  9. 获取IOS bundle中的文件

    在xcode中选择bundle中的文件,右键Show in Finder即可拷贝或删除文件.

随机推荐

  1. java视频格式转换代码

    http://blog.163.com/zzf_fly/blog/static/20958915820127217443816/ package com.gkzx.online.action; imp ...

  2. before和after的强大

    前言:刚学他两个的时候,是用于清除浮动,而且曾单纯的以为俩只有这作用. 但看到几篇博客后,发现自己是多么的无知,他两个的强大远不止于此. 当然,这篇文章大多数是借鉴网上的实例,在加上自己的些许简介而成 ...

  3. Compound Interest Calculator4.0

    Compound Interest Calculator4.0 1.团队协作准备:每个同学在github上完成FORK,COMMENT(学号后三位+姓名),PR,MERGE的过程. 2.你的RP由你的 ...

  4. python 第三方模块 转 https://github.com/masterpy/zwpy_lst

    Chardet,字符编码探测器,可以自动检测文本.网页.xml的编码. colorama,主要用来给文本添加各种颜色,并且非常简单易用. Prettytable,主要用于在终端或浏览器端构建格式化的输 ...

  5. JavaWeb基础: Web应用和Web服务器

    Web Server工作原理 假设工程师想提供一个网页浏览的Web应用给客户,需要经过以下几步: 在指定目录下新建资源(hello.html) 编写一个服务器ServerDemo监听请求和响应请求:S ...

  6. 工程目录 Java/Web/Maven

    jar包和war包的区别 war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运 ...

  7. struts2 拦截器的注册在strut.xml中

    根据需要:需要在struts.xml中注册拦截器为以下内容  根据自己的业务需要更改参数 <!DOCTYPE struts PUBLIC "-//Apache Software Fou ...

  8. form表单提交过程

    本文为转载文章! 今天,我将站在HTML和单纯的Asp.net框架的角度来解释它们的工作方式,因此,本文不演示WebForms服务器控件的相关内容. 简单的表单,简单的处理方式 好了,让我们进入今天的 ...

  9. Spring使用RowMapper将数据中的每一行封装成用户定义的类

    1.dao public interface MapperSelecteAllEmpDao { public List<Emp> all(); } 2.实现类 public class M ...

  10. 5月25日 DOM

    练习一:输入答案,弹出是否正确. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...