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