[JiaJung]&iOS组件化(下篇)-加载XIB、图片资源

0.2 2017.09.18 23:01* 字数 1056 阅读 7693评论 25

本篇是iOS项目实践的最后一篇。大家可以下载demo,根据这几篇文章流程实现一个现有项目的组件化。当然,每个公司根据自己的业务需求组件化的方式会有所不同,但大概的思路和流程不会有很大的差异。

上一篇中完成了专题组件作者组件的集成及管理。但是加载XIB和图片时任然存在一些问题。切回到FFSpecialKit组件,当点击专题界面中的cell时会报错。这是因为项目中用到XIB加载出错了。

Snip20170915_1.png

拷贝路径到Finder前往去查看一下,如下图所示指定的bundle路径下确实没有FFSpecialDetailView这样的XIB文件。

Snip20170915_2.png

回到代码查看一下,原来加载XIB的方式如下:

Snip20170915_3.png

显然通过加载上面的bundle的方式加载不到XIB,需要重新设置budle的路径,修改如下:

Snip20170915_5.png

拷贝路径前往查看,XIB果然在指定的bundle下

Snip20170915_6.png

再次运行,点击专题cell测试就可以正常跳转了。不难发现cell中一些图片资源未显示(比如:灰色的线、评论、点赞等图标),接下来需要处理这些图片资源显示的问题。


Snip20170915_7.png

是否记得在FFSpecialKit中和Classes文件夹同级有个Assets文件夹,该文件夹专门用来存放组件的资源文件。


Snip20170915_8.png

接着,把图片资源拖入Assets文件夹,需要修改.podspec文件,打开资源的加载路径,然后执行pod install。然后会发现多了一个Resource的资源文件夹。


Snip20170915_10.png

运行发现图片任然未显示,这是因为项目中是通过[UIImage imageNamed:@“图片名"]方式加载本地图片,这种方式默认是从mainBundle中去加载图片,和XIB的问题一样也会找不到图片。

Snip20170915_11.png

Snip20170915_12.png

我们发现图片实际是在FFSpecialKit组件下FFSpecialKit.bundle 里面,因此需要改变图片的加载方式.

说明:必须指明图片的全名和图片所在bundle的包名.

Snip20170918_20.png

因为涉及到@2x,@3x图片这里不能写成固定的,应该按照scale来设置


Snip20170918_21.png

再次运行图片就显示了


Snip20170918_22.png

因为之前设置图片的方式都需要修改,上面修改图片加载方式的代码在很多地方都会用到,所以最好的做法就是抽取一个工具方法,笔者这里是添加了一个UIImage的分类。把这个分类添加到基础组件FFCategory中,更新组件就ok了。

#import <UIKit/UIKit.h>

@interface UIImage (Extension)
    
+ (instancetype)ff_imagePathWithName:(NSString *)imageName bundle:(NSString *)bundle targetClass:(Class)targetClass;

@end
#import "UIImage+Extension.h"

@implementation UIImage (Extension)
    
+ (instancetype)ff_imagePathWithName:(NSString *)imageName bundle:(NSString *)bundle targetClass:(Class)targetClass {
        
        NSInteger scale = [[UIScreen mainScreen] scale];
        NSBundle *currentBundle = [NSBundle bundleForClass:targetClass];
        NSString *name = [NSString stringWithFormat:@"%@@%zdx",imageName,scale];
        NSString *dir = [NSString stringWithFormat:@"%@.bundle",bundle];
        NSString *path = [currentBundle pathForResource:name ofType:@"png" inDirectory:dir];
        return path ? [UIImage imageWithContentsOfFile:path] : nil;
}

@end

回到项目用该Category更新代码

Snip20170918_27.png

再次运行,相关图片就显示出来了。

Snip20170918_1.png

细心的朋友会发现字体发生了变化,接下来设置字体,将字体相关文件也拖入到Assets文件夹下,然后修改一下podspec文件。最后执行pod install把字体资源pod进来。

修改FFSpecial.podspec文件如下:

  s.resource_bundles = {
    'FFSpecialKit' => ['FFSpecialKit/Assets/*']
  }

执行完pod install之后,字体资源就pod 进来了。

Snip20170918_3.png

接着在原来设置字体的地方做相应的修改,和修改图片资源路径的方式相似。例如修改FFSpecialCell中的代码如下,通过加载bundle路径的方式加载字体。当然,因为有很多的地方都会用到,最好也抽取成工具类。

- (UILabel *)categoryLabel{
    if (_categoryLabel == nil) {
        _categoryLabel = [[UILabel alloc]init];
        NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
        NSString *path = [currentBundle pathForResource:@"CODE BOLD.OTF" ofType:nil inDirectory:@"FFSpecialKit"];
        [_categoryLabel text:nil textColor:kHexColor_c7a762 fontSize:FONT_SIZE_14 fontName:path];
    }
    return _categoryLabel;
}

- (UILabel *)titleLabel{
    if (_titleLabel == nil) {
        _titleLabel = [[UILabel alloc]init];
        NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
        NSString *path = [currentBundle pathForResource:@"CODE LIGHT.OTF" ofType:nil inDirectory:@"FFSpecialKit.bundle"];
        [_titleLabel text:nil textColor:kHexColor_555 fontSize:FONT_SIZE_14 fontName:path];
    }
    return _titleLabel;
}

- (UILabel *)descLabel{
    if (_descLabel == nil) {
        _descLabel = [[UILabel alloc]init];
        NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
        NSString *path = [currentBundle pathForResource:@"CODE LIGHT.OTF" ofType:nil inDirectory:@"FFSpecialKit.bundle"];
        [_descLabel text:nil textColor:kHexColor_555 fontSize:FONT_SIZE_12 fontName:path];
        _descLabel.numberOfLines = 2;
    }
    return _descLabel;
}

到这里都修改完后,再次运行就ok了。

Snip20170918_4.png

后记
笔者通、下三篇文章叙述了iOS项目实现组件化的一个大概流程。很感谢大家的阅读,也希望对您有所帮助。当然,如果对您没有帮助,浪费了您宝贵,笔者深感抱歉。第一次在简书上写技术文章,笔者小学语文没有学好,语言组织匮乏,希望各位多多指点。相互交流、相互成长。

小礼物走一走,来简书关注我

 
开发
 
 
左岸__
13楼 · 2018.05.08 18:15

我从码云上下载下来的LDBase Development Pods下xib有 但是我从cocopods下安装的没xib文件 安装的版本号 也是最新的

 
 
左岸__
12楼 · 2018.05.08 17:12

现在有个很大的疑惑是 我把.h .m .xib拖到classes文件夹下 编译 改spec文件的版本号 打标签 把本地的私有库搞到远程私有索引库里
然后cd 到Example里 pod install
安装完之后 ! 只有.h 和.m 在Development Pods下 为什么.xib没出现呢s.resource_bundles = {
'LDBase' => ['LDBase/Assets/*.png','LDBase/Classes/MainFrame/*.xib']
}
得需要我手动 addFilesToPods

 
 
左岸__
11楼 · 2018.05.08 16:54

NSBundle *bundle = [NSBundle bundleForClass:self.class];
加载xib这块 我如上这么写 这个bundle只是定位到了.app的文件 没有定位到.framework文件 您知道咋嘛回事吗

 
s.resource_bundles = {
'LDBase' => ['LDBase/Assets/*.png','LDBase/Assets/*.xib']
}
2018.05.08 16:57 回复
 
 
曹叔
10楼 · 2018.04.10 10:12

出现这种情况 只能说明你打包的方式有问题,其实在刚开始打包的时候指定资源目录就可以避免了,就是 s.resource

 
 
走近科学探索发现
9楼 · 2018.03.09 17:43

我在XIB文件里直接用了图片显示不出来,同事的却可以显示。您遇到过吗?
而且我的Resources下是这样Resources/GOYOTowerCraneModule/Assets展示的,不是像您那样直接展出图片的。

 
请问您解决了吗,我也遇到了同样的问题
2018.03.31 11:57 回复
 
@AppleSmile 我当时主要是因为cell 用的是注册的方式写的,注册方式就无法展示出xib里的图片。改成常规写法就行了。
2018.03.31 13:23 回复
 
 
PursueDream
8楼 · 2018.03.07 19:25

图片要写全名,那么2x图和3x图怎么作区分,难道要在代码里判断看,还是说虽然写的是2x的图,但是系统会根据需要加载3x的??

1人赞 回复
 
在代码里面判断的 判断当前的scale,然后加载不同分辨率的图片
2018.04.24 09:44 回复
 
 
海浪萌物
7楼 · 2018.01.29 20:26

最近也在研究组件化,想问下,对应网络请求的同意错误时放到网络层,还是放在业务层的base类呢

 
网络层属于基础层组件,不应该掺杂任何的业务代码,有错就回调到上层处理。建议再做一个 业务相关的网络层-统一处理某些东西
2018.04.24 09:45 回复
 
 
低吟浅唱1990
6楼 · 2018.01.04 10:36

提供的demo不是完成组件化之后的demo?

 
 
WainYan
5楼 · 2017.12.18 11:24

@JiaJung 你好,
#define Path_FZQKBYSJW [[NSBundle mainBundle] pathForResource:@"方正清刻本悦宋简体" ofType:@"TTF"]

#define FZQKBYSJWGB1(FONTSIZE) [UIFont fontWithName:(Path_FZQKBYSJW) size:(FONTSIZE)]

我这样写,但是label字体还是系统的,请问是哪里设置错了。

 
 
coderJeffrey
4楼 · 2017.10.09 10:38

请问下,FFSpecialKit这个项目修改后pod install,FlowerField项目应该怎么把FFSpecialKit修改的东西拉取下来呢?git不太懂,是FFSpecialKit修改后提交新版本吗?!s.version可以不改动不?感觉每次修改一点点就提交新版本体验不太好,有没有什么办法呢大佬。

 
FFSpecialKit修改代码之后需要重新提交的,version也需要改动的,因为你更新了内容相当于你的版本号就变化了,在主工程里需要重新pod update一下, git命令行比较简单,网上的文章很多的。
2017.10.09 11:09 回复
 
 
Icoder_e90d
3楼 · 2017.10.09 10:06

非常细致,很赞,我还有个问题就是这个pod多语言语言国际化怎么整啊

 
@Icoder_e90d 国际化我接触的比较少,暂时无法提供太多有用信息,等我研究一下:smile:
2017.10.09 10:13 回复
 
@JiaJung 恩,等研究好了加在文章的后面吧,:clap:
2017.10.09 10:29 回复
 
@Icoder_e90d 好的,谢谢
2017.10.09 11:09 回复
添加新评论 还有4条评论, 展开查看
 
 
syl_4cad
2楼 · 2017.09.19 08:57

🙄

 
被以下专题收入,发现更多相似内容
iOS程序犭袁
iOS 伪组件专题
iOS之开发配置
iOS之框架架构
111
iOS组件化
iOS 组件化
展开更多
推荐阅读 更多精彩内容
给个建议:最好别去小公司!

大公司裸辞三个月不到,别人问我:平台大,工资高,前景好,你为什么还要辞职?我能在十分钟内能写篇800字夹叙夹议的文章哭诉大 公司满是弊病。 但当别人问到我,是选择大公司还是小公司时,我的答案通常会是:最好别去小公司,首选大公司。为什么? 1、大公司:替人打工的感觉会没那么强烈。 认识几个比较年轻的创业公司老板,都有一个共同特点:爱讽刺打工者。做老板的人,一旦开始膨胀,典型表现就是爱歧视在工作岗位上辛辛苦苦挣工资的人:diss打工者是弱智老板刷存在感的利器。 创业公司老板A,最爱在朋友圈发的鸡汤主题是:为什么大多数人都在朝九晚五中走向平庸,因为他们害怕改变,所以只能一辈子为人打工。鸡汤没毛...

Android进阶开发
碎碎念

写了这么多年,终于有了一点点成就感。 因为工作关系,我之前认识的一个叫做橙子的游客,有一天在微信上和我聊。说看到了一个同样的叫东方地秀的人写的文章,问是不是我?同时发来了截图。我说,当然是我呀,我都写了好多年了。 她说我写得真好,她看了很多我写的文章。说实话我很感动,那些曾经熬过的夜,似乎都变得无足轻重。被这样一个只有一面之交的美女所夸奖,我感到很欣慰。 橙子现在在深圳,当时,她来敦煌的时候还是一个单身贵族,现在已然是一个宝宝的妈妈了。 六年前,我们有一面之交,彼此加了微信。 可能都忙,也没有聊过,最多点个赞,表示“朕已阅”。 没想到,她还记得我。这也是我们第一次聊天。 感谢旅游,让我们...

东方地秀
我才26岁,感觉人生快要废了:比一事无成还可怕,是丧失了成就感

文|赵晓璃 写在前面的话: 你有没有这样的苦恼,那就是眼前的工作味同嚼蜡,每天苦哈哈地上班,却丝毫没有成就感? 你可曾有过这样的期待,想要找到能调动浑身上下每一个细胞的工作,然后兴致勃勃地投入? 你仗着年轻不断切换职业跑道,做了很多种尝试却依然一事无成。 有一天,你突然惊觉,自己仿佛不再年轻了。 前所未有的惶恐与焦灼宛如潮水般向你涌来...... 一、 咨询者小雪(化名)站在职业选择的十字路口,不禁倍感迷茫。 小雪,女,26岁,高中学的理科,后在家人的建议下报考了电子信息工程专业,学习期间才发现,自己对这种了无生趣的信号、冰冷的设备等完全无感,想到自己今后要是从事这个领域的工作,岂不是活...

赵晓璃
潜规则

单位要在年轻人中提拔一批中层干部,王甲跟李乙都在考察范围内。 王甲回家后跟妻子商量。一致认为,要万无一失,得给领导包个红包,这是潜规则。王甲准备的红包里包了两万。 李乙回家后跟妻子商量。一致认为,要万无一失,得给领导包个红包,这是潜规则。李乙准备的红包里包了两万。 从领导家回来后,王甲高兴的给妻子说:领导清廉,不要红包,让他努力工作就行。 从领导家回来后,李乙表情凝重的给妻子说:领导没要红包,应该是嫌少,得给包一个大一些的红包,明天再去,给包四万。妻然之。 不久,任命结果出来了,王甲、李乙均赫然在列。 回家后,王甲兴奋的给妻子说:领导果然清廉,以后一定要努力工作,报答领导的知遇之恩...

南山顽石
老师的幸福,几个人能懂

当写下这个题目时,有些自惭形愧,这么些年,很少执笔写老师,而今天,就用浅浅的文字,说些心中搁置已久的话。 小的时候,不懂老师,觉得老师是一项高尚的职业,教书育人,孜孜不倦,老师给我的印象总是那么高大威猛,博大精深,所以,那个时候很怕老师,生怕做错了事,被老师惩罚。 稍大点,能明白老师的辛苦,但不能体会,每次老师站在讲台给我们讲题的时候,反复强调知识点,反复叮嘱我们这个知识点一定要弄懂,高考、中考就考这个,只要会了这个知识点就能考到自己理想的学校,那个时候,我看得到老师眼睛里的真诚和执着。 再大点,能明白当一个老师是不容易的,而当一个好老师,更是那么的不易,她(他)要付出的又何止是知识,还...

澜嫣

T

posted @ 2019-03-30 15:05  yuhui.Mr  阅读(1208)  评论(0)    收藏  举报