十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇文章给大家分享的是有关怎么在IOS中存放图片,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联公司是一家专注于成都网站设计、网站建设、外贸网站建设与策划设计,乌尔禾网站建设哪家好?创新互联公司做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:乌尔禾等地区。乌尔禾做网站价格咨询:18982081108Image.xcassets
创建 .xcassets,以 Image Set 形式管理图片,添加图片后会生成对应的 content.json 文件
加入 @2x 和 @3x 等倍图后,打包后以 Assets.car 的形式存在,
使用 [UIImage imageNamed:@"xxx"] 方式读取图片,可以使用图片缓存 —— 相当于创建了一个 key-value的字典,key 为图片名,value 为图片对象。创建图片对象后,该对象被加入到 NSCache 中(解码后的 Image Buffer),直到收到内存警告的时候,才会释放不在使用的图片对象。 因此,对于需要在多处显示的图片,其对应的 UIImage 对象只会被创建一次(不考虑内存警告时的回收),减少内存消耗。
图片直接加入工程中作为Resource
读取方式:创建图片 Resource 文件夹,直接将图片加入到工程中,使用如下方式读取图片
NSString *path = [NSBundle.mainBundle pathForResource:@"xxx" type:@"png"]; UIImage *image = [UIImage imageWithContentsOfFile:path];
特性:在 Resource 的图片管理方式中, 所有的图片创建都是通过读取文件数据得到的, 读取一次文件数据就会产生一次 NSData 以及产生一个 UIImage。 当图片创建好后销毁对应的 NSData,当 UIImage 的引用计数器变为 0 的时候自动销毁 UIImage,这样的话就可以保证图片不会长期地存在在内存中
使用场景:由于这种方法的特性, 所以 Resource 的方法一般用在图片数据很大, 图片一般不需要多次使用的情况,比如说引导页背景(图片全屏)
优势:图片不会长期保存在内存当中, 所以不会有很多的内存浪费。同时, 大图一般不会长期使用, 而且大图占用内存一般比小图多了好多倍, 所以在减少大图的内存占用中, Resource 做的非常好
使用Bundle文件
Bundle 即资源文件包,将许多图片,XIB,文本文件组织在一起,打包成一个 Bundle 文件,方便在其他项目中引用包内的资源。
Bundle 文件是静态的,不参与项目的编译,Bundle 包中不能包含可执行的文件,它仅仅是作为资源,被解析成为特定的二进制数据。
优势:Bundle 中文件不参与项目编译,不影响App包的大小(可用于App的瘦身); 使用 bundle 方式方便对文件进行管理,方便在其他项目中引用包内的资源。
使用场景:较大的图片,或者使用频率较低的图片
读取方式:使用 imageWithContentsOfFile 进行读取,如下方法1;也可以对 UIImage 进行扩展,如下方法2
使用 imageWithContentsOfFile 读取
/// BSKDefine.h // bundle path #define STBundle_Name @"SafeToolResource.bundle" #define STBundle_Path [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:STBundle_Name] #define STBundle [NSBundle bundleWithPath:STBundle_Path]
/// usage #import "BSKDefine.h" UIImageView * headerBgImgView = [[UIImageView alloc] init]; headerBgImgView.image = [UIImage imageWithContentsOfFile:[SecKill_BUNDLE pathForResource:@"xxxx" ofType:@"png"]];
对 UIImage 进行扩展,创建 UIImage+BSKResources 类
/// UIImage+BSKResources.h NS_ASSUME_NONNULL_BEGIN @interface UIImage (BSKResources) + (UIImage *)bskImageNamed:(NSString *)imageName InBundleName:(NSString *)bundleName; @end NS_ASSUME_NONNULL_END
/// UIImage+BSKResources.m #import "UIImage+BSKResources.h" @implementation UIImage (BSKResources) + (UIImage *)bskImageNamed:(NSString *)imageName InBundleName:(NSString *)bundleName { NSString *resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:bundleName]; NSBundle *resourceBundle = [NSBundle bundleWithPath:resourcePath]; return [UIImage imageNamed:imageName inBundle:resourceBundle compatibleWithTraitCollection:nil]; } @end
/// usage #import "UIImage+BSKResources.h" UIImageView * headerBgImgView = [[UIImageView alloc] init]; headerBgImgView.image = [UIImage bskImageNamed:@"xxx" InBundleName:@"BSKResources.bundle"]];
Bundle 和 xcassets 区别
xcassets 里面的图片,只能通过 imageNamed 加载。Bundle 还可以通过 imageWithContentsOfFile 等方式加载
xcassets 里的 2x 和 3x,会根据具体设备分发,不会同时包含(App Slicing),而 Bundle 会都包含
xcassets 内,可以对图片进行 Slicing,即裁剪和拉伸,Bundle 不支持
Bundle 内支持多语言,xcassets 不支持
此外,使用 imageNamed 创建的 UIImage,会立即被加入到 NSCache 中(解码后的 Image Buffer),直到收到内存警告的时候,才会释放不在使用的 UIImage;而使用 imageWithContentsOfFile 创建的对象,每次都会重新申请内存,相同图片不会缓存。因此,建议常用的、较小的图,放在 xcassets 内管理,而大图、使用频率较低的图,应该放在 Bundle 内管理
以上就是怎么在IOS中存放图片,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联网站建设公司行业资讯频道。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。