iOS 组件化开发(三):加载资源文件

经过前两篇文章的学习,相信对组件化开发有了大致的了解,那我们这篇文章就来讲讲资源文件的加载吧

这里我新建了一个LXFMain组件库,主要是用来显示TabBar的玩意,然后再进行组件化抽离出来,其中的过程这里不再赘述,还没了解过的同学建议先阅读下这两篇文章吧 iOS 组件化开发(一):远程私有库的基本使用 iOS 组件化开发(二):远程私有库的更新与子库

这里跟之前不一样的地方在于多了图片资源,组件的核心代码放在Classes文件夹中,而图片我们则存放于Assets目录下,如图所示

存放位置

一、修改Spec

将关于资源加载的注释去掉

s.resource_bundles = {
 # 'LXFMain' => ['LXFMain/Assets/*.png']
 'LXFMain' => ['LXFMain/Assets/*']
}

回到LXFMain的模板库,我们进行一次本地的安装和测试(pod install)

可以看到,图片资源也安装进来了,但是运行的效果如下图,图片并不能成功加载出来

没有图标

二、修改加载资源代码

这是当前加载图片的相关代码

[UIImage imageNamed:@"图片名称"];

show in finder

右击显示包内容

LXFMain.framework

图片就在这个LXFMain.bundle里面(这里就不截图看了),这里主要是让大家对这个目录结构有个了解

我们对imageNamed进行跳转到定义操作

imageNamed

// load from main bundle

可以看到,官方注释着imageNamed加载的是main bundle中的资源,mainBundle的位置如下图

mainBundle

这样当然就无法加载到图片啦,我们需要让它加载自己当前所在bundle里的图片 ,所以加载图片的代码需要进行修改

NSString *normalImgName = @"个人@2x.png";
NSBundle *curBundle = [NSBundle bundleForClass:self.class]; // 获取当前bundle
NSString *normalImgPath = [curBundle pathForResource:normalImgName ofType:nil inDirectory:@"LXFMain.bundle"];
UIImage *normalImage = [UIImage imageWithContentsOfFile:normalImgPath];

但是直接写LXFMain.bundle并不好,不可控,所以还需要改进一下:

NSString *normalImgName = [NSString stringWithFormat:@"%@@2x.png", normalImg];
NSBundle *curBundle = [NSBundle bundleForClass:self.class];
//  *********** 重点 ***********   //
NSString *curBundleName = curBundle.infoDictionary[@"CFBundleName"];
NSString *curBundleDirectory = [NSString stringWithFormat:@"%@.bundle", curBundleName];
NSString *normalImgPath = [curBundle pathForResource:normalImgName ofType:nil inDirectory:curBundleDirectory];
//  ***************************   //
UIImage *normalImage = [UIImage imageWithContentsOfFile:normalImgPath];

成功加载

三、聊聊xib

Xib的加载也是如此

NSBundle *curBundle = [NSBundle bundleForClass:self.class];
LXFCenterView *centerView = (LXFCenterView *)[curBundle loadNibNamed:@"LXFCenterView" owner:nil options:nil].firstObject;
centerView.frame = CGRectMake(30, 140, 200, 100);
[self.view addSubview:centerView];

不过xib中值得一提的是,如果是直接在xib中拖入一个imageView控件来设置图片的加载,我们则需要在图片名字前加上当前bundle名称

LXFMain.bundle/个人

这里除了当前xib要加载的图片不属于mainBundle这个原因之外,还有一点就是xib文件与bundle存放位置属于同一级别,故直接使用相对路径的方式,在图片名字前加上bundle名称即可。

同一目录级别

xib上的操作

虽然无法在xib上直接看到效果,不过确实是有效的

xib成功显示图片

四、遇到的小问题

[!] Unable to find a pod with name, author, summary, or description matching `lxfmain`

我做完一切操作后发现搜索报上面那个错,解决方案是删除本地索引文件,然后再搜索一遍,系统会自动帮你再生成一切本地索引文件,然后就搞定了~

rm -rf ~/Library/Caches/CocoaPods/search_index.json 
pod search lxfmain

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

IOS开发之记录用户登陆状态

  上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的。但熟悉CoreData的使用流程后,CoreData还...

1929
来自专栏mukekeheart的iOS之旅

iOS学习——获取iOS设备的各种信息

  不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够...

6347
来自专栏肖洒的博客

模拟登陆我终于还是进了

爬了这么久的教务处,终于还是绕过了千山万水登进来了。 这段时间准备期末考,忙,好久不更博。 年终总结也没有写。 是时候开更啦!

1032
来自专栏移动端开发

个推你应该这样用的

前言:     说到这个远程推送,大家知道的应该都挺多的,但用到的估计极光和个推要占一很大部分,这篇博客重点说的就是个推的使用,个推官网的链接在这里,它的集成是...

5499
来自专栏進无尽的文章

编码篇-从一个第三方的StoryBoard项目中剥离部分功能到纯代码项目中

最近项目中需要实现视频监控功能,于是就用了某企业旗下的一款视频监控产品,在集成官方Dome中的监控画面播放的功能时,发现整个项目都是通过StoryBoard搭建...

912
来自专栏子勰随笔

再看Android官方文档之建立第一个APP

1183
来自专栏WeTest质量开放平台团队的专栏

了解和分析iOS Crash

北京时间凌晨一点,苹果一年一度的发布会如期而至。新机型的发布又会让适配相关的同学忙上一阵子啦,并且iOS Crash的问题始终伴随着移动开发者。本文将从三个阶段...

1253
来自专栏移动端周边技术扩展

app框架整体设计

4353
来自专栏拂晓风起

cocos2d-js 调试办法 断点调试 Android真机调试

1572
来自专栏coding...

swift3.0 coreData的使用-日记本demo效果需求分析创建工程添加数据库改写Detail页面改写Master页面Demo地址

基于官方MasterDetail模板,官方写了很多复杂的coredata逻辑,在此基础上快速开发简单的日记本程序。

864

扫码关注云+社区