动态库和静态库之二:引用资源文件

一、新建Bundle

示例是在主工程SwiftTest的子工程Home里进行。

因为iOS框架中没有Bundle,所以要在macOS中创建Bundle。

新建Bundle.png

二、往Bundle中添加资源

将资源文件(如图片、xib文件)拖入刚创建的Bundle文件夹下。新创建xib时可以直接创建到Bundle文件夹目录下。

给Bundle添加资源.png
添加完资源示例.png

三、配置Bundle

1.修改Base SDK为iOS

修改Base SDK.png

2.iOS Deployment Target改为需要支持的最低版本

修改Deployment版本.png

注意:
可以不用修改Deployment版本,但是不修改的话,后续如果使用手动编译、且在真机上进行编译,则可能会报Deployment Target不匹配的错。


真机编译Bundle时Deployment Target不匹配报错.png

3.Enable Bitcode设置为No,其中只放资源文件,否则编译会报错

设置Enable Bitcode.png

Enable Bitcode未设置为No报错.png
  1. COMBINE_HIDPI_IMAGES设置为NO
    iOS 创建Bundle时放入的图片资源(.png)在默认配置下会被转为.tiff格式,使用的时候找不到。因为在iOS中创建bundle时会用一个“hack”,为了使所有的运行需要更改一个配置。找到bundle的工程,Buld Settings > COMBINE_HIDPI_IMAGES设置为NO
修改COMBINE_HIDPI_IMAGES.png

COMBINE_HIDPI_IMAGES为YES时打包后成果.png

COMBINE_HIDPI_IMAGES为NO时打包后成果.png

四、编译Bundle

在Scheme中选择Bundle作为target、设备选Any iOS Device或者具体真机进行编译,不先编译的话,使用的时候会报错。

编译Bundle.png

未编译就使用报错.png

注意:

  • 如果动态库Target的Dependencies中设置了Bundle依赖,则可不手动提前编译Bundle。

五、使用Bundle里的资源文件

1.在动态库Target的Copy Bundle Resources、Dependencies中添加Bundle。

引用Bundle.png

注意:

  • 必须在Dependencies (图中3.1)中也添加一下Bundle依赖,否则会出现编译运行不报错,打包报错的问题。
未设置Dependencies依赖打包报错.png

2.使用xib

let bundle = Bundle(for: HomeViewController.self)
// 加载方式1:如果未在Copy Bundle Resources中引用Bundle时会出现crash现象
let nibs1 = bundle.loadNibNamed("HomeResource.bundle/ToolBar", owner: nil, options: nil)
// 加载方式2:推荐使用
guard let resourceURL = bundle.url(forResource: "HomeResource", withExtension: "bundle") else { return }
let nibs2 = Bundle(url: resourceURL)?.loadNibNamed("ToolBar", owner: nil, options: nil)
// 读取xib中视图并展示
if let xibView = nibs?.first as? UIView {
    xibView.frame = CGRect(x: 20, y: 180, width: 250, height: 44)
    view.addSubview(xibView)
}

3.使用图片

let imageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 80, height: 80))
let bundle = Bundle(for: HomeViewController.self)
// 加载方式1
imageView.image = UIImage(named: "HomeResource.bundle/load_failure", in: bundle, compatibleWith: nil)
// 加载方式2
guard let resourceURL = bundle.url(forResource: "HomeResource", withExtension: "bundle") else { return }
imageView.image = UIImage(named: "load_failure", in: Bundle(url: resourceURL), compatibleWith: nil)

六、修改资源文件后的处理

  • 通常情况下(动态库Target未在Dependencies中设置Bundle依赖试),Bundle中资源文件有修改时,需重新编译Bundle,其使用方(动态库)才能读取修改后的资源。
  • 在动态库Target的Dependencies中添加对Bundle的依赖,则每次编译动态库时也会自动编译Bundle,从而能随时读取Bundle中资源的更新。
Dependencies中设置Bundle依赖.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容