前言
Cocoapods中Pod引用資源的方式有多種,不同的方式對(duì)資源的使用還是有區(qū)別的,但也有一定的規(guī)律,這里我用一個(gè)樣例工程來(lái)進(jìn)行說(shuō)明,樣例工程名叫:AssetsDemo,使用pod lib create AssetsDemo命令創(chuàng)建,目錄結(jié)構(gòu)如圖:
這個(gè)pod很簡(jiǎn)單,Classes目錄只有一個(gè)cell的swift和xib文件,Assets目錄有一些圖片資源,其中的TestTableViewCell.xib使用了這張test圖片。目錄結(jié)構(gòu)如下:
├──Assets │├──Images.xcassets ││├──Contents.json ││└──test.imageset ││├──Contents.json ││├──test@2x.png ││└──test@3x.png │├──test1@2x.png │└──test1@3x.png └──Classes ├──TestTableViewCell.swift └──TestTableViewCell.xib
前期工作已經(jīng)準(zhǔn)備完畢,下面說(shuō)下xib和圖片資源不同使用方式下的區(qū)別:
將xib放入source_files,圖片放入resource_bundles
在podspec的寫(xiě)法如下:
s.source_files='AssetsDemo/Classes/**/*' s.resource_bundles={ 'AssetsDemo'=>['AssetsDemo/{Assets,Classes}/**/*.{xcassets,png}'] }
運(yùn)行后會(huì)生成這樣的framework:
我們可以看到,xib后綴會(huì)變成nib,并被放入framework中,而圖片資源被放入了AssetsDemo.bundle中。
這樣的結(jié)構(gòu),顯然在常規(guī)情況下,xib是沒(méi)法找到圖片并顯示的。但是有一種有缺陷的用法可以勉強(qiáng)解決這個(gè)問(wèn)題,那就是直接把png圖片打包到AssetsDemo.bundle中,然后在xib中將圖片名改為AssetsDemo.bundle/圖片名。這樣做會(huì)導(dǎo)致xib編輯時(shí)無(wú)法正確的顯示圖片,也沒(méi)法使用xcassets目錄來(lái)存儲(chǔ)圖片,并且會(huì)導(dǎo)致一些系統(tǒng)優(yōu)化無(wú)法生效。不推薦這樣使用。
將xib和圖片都放入resources
在podspec的寫(xiě)法如下:
s.source_files='AssetsDemo/Classes/**/*.swift' s.resources='AssetsDemo/{Assets,Classes}/**/*.{xcassets,png,xib}'
網(wǎng)上有說(shuō)法使用resources來(lái)指定資源,被指定的資源只會(huì)簡(jiǎn)單的被 copy到目標(biāo)工程中(主工程),資源的使用會(huì)簡(jiǎn)化,但是會(huì)與主工程同名資源文件產(chǎn)生沖突。但是在Xcode13和pod 1.11.2版本下,實(shí)測(cè)不是這樣的。官方的文檔也不是這樣說(shuō)的Podspec Syntax Reference v1.11.2[1],它是分靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)場(chǎng)景,靜態(tài)庫(kù)才有這類(lèi)問(wèn)題。
上述配置運(yùn)行后會(huì)生成這樣的framework結(jié)構(gòu):
從上圖可以看到,資源被直接放入了所在的framework,另外查看主工程的包文件,是沒(méi)有這些資源的。綜上所述,可以得出結(jié)論,動(dòng)態(tài)庫(kù)中,resources指定的資源,會(huì)被直接copy到framework,不會(huì)與主工程資源文件沖突。
另外,由于xib文件TestTableViewCell.nib和Assets.car在同一個(gè)目錄下,xib可以直接從Assets.car中找到圖片資源并正確展示
在主工程中打開(kāi)這個(gè)xib文件,如果主工程中有同名資源,那么編輯時(shí)會(huì)優(yōu)先顯示主工程的資源,但是實(shí)際運(yùn)行時(shí)還是這個(gè)pod的資源。
這里xib可以放入source_files和resources,效果是一樣的
將xib和圖片都放入resource_bundles
在podspec的寫(xiě)法如下:
s.source_files='AssetsDemo/Classes/**/*.swift' s.resource_bundles={ 'AssetsDemo'=>['AssetsDemo/{Assets,Classes}/**/*.{xcassets,png,xib}'] }
上述配置運(yùn)行后會(huì)生成這樣的framework結(jié)構(gòu):
從上圖可以看到,xib文件TestTableViewCell.nib和Assets.car在同一個(gè)目錄下,xib可以直接從Assets.car中找到圖片資源并正確展示。其中,test1圖片雖然沒(méi)有以xcassets格式引入,但是也能直接找到并正確展示。
總結(jié)
綜上所述,我們可以得出一個(gè)原則:盡量讓xib和xcassets與圖片在同一個(gè)目錄下,這樣xib可以直接找到圖片并正常展示。
關(guān)于resources和resource_bundles,在動(dòng)態(tài)庫(kù)下,他們最終效果差不多,只是resource_bundles會(huì)把資源封裝在bundle中,使用的時(shí)候會(huì)稍微麻煩一點(diǎn):
//使用resources的情況: letmyBundle=Bundle(for:TestTableViewCell.self) tableView.register(UINib.init(nibName:"TestTableViewCell",bundle:myBundle), forCellReuseIdentifier:"cell") //使用resource_bundles的情況: letmyBundle=Bundle(for:TestTableViewCell.self) letpath=myBundle.path(forResource:"AssetsDemo",ofType:"bundle")! letassetsBundle=Bundle.init(path:path) tableView.register(UINib.init(nibName:"TestTableViewCell",bundle:assetsBundle), forCellReuseIdentifier:"cell")
至于靜態(tài)庫(kù),則推薦使用resource_bundles了。綜合來(lái)看,不管是靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù),都推薦使用resource_bundles來(lái)引入所有的資源,因?yàn)閞esources方式在靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)場(chǎng)景,資源的使用方法差異太大,而resource_bundles各場(chǎng)景是一致的。
至于source_files,它只能引入代碼和xib文件,不支持引入圖片等其它資源。不建議用source_files方式引入xib,如果一定要使用,要注意避免出現(xiàn)xib中圖片無(wú)法加載的問(wèn)題。
by: 掘金 - 星的天空
審核編輯:湯梓紅
-
文件
+關(guān)注
關(guān)注
1文章
566瀏覽量
24742 -
命令
+關(guān)注
關(guān)注
5文章
684瀏覽量
22021 -
靜態(tài)庫(kù)
+關(guān)注
關(guān)注
0文章
21瀏覽量
7431 -
iOS
+關(guān)注
關(guān)注
8文章
3395瀏覽量
150604 -
資源
+關(guān)注
關(guān)注
0文章
59瀏覽量
17784
原文標(biāo)題:iOS 中 Pod 庫(kù)資源引用探究
文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論