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