精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

iOS中Pod庫資源引用探究

Android編程精選 ? 來源:稀土掘金技術社區 ? 2023-05-26 11:11 ? 次閱讀

前言

Cocoapods中Pod引用資源的方式有多種,不同的方式對資源的使用還是有區別的,但也有一定的規律,這里我用一個樣例工程來進行說明,樣例工程名叫:AssetsDemo,使用pod lib create AssetsDemo命令創建,目錄結構如圖:

b0dcbe7c-fb6a-11ed-90ce-dac502259ad0.jpg

這個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:

b0e86088-fb6a-11ed-90ce-dac502259ad0.jpg

我們可以看到,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結構:

b0f23784-fb6a-11ed-90ce-dac502259ad0.jpg

從上圖可以看到,資源被直接放入了所在的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結構:

b0fa7fb6-fb6a-11ed-90ce-dac502259ad0.jpg

從上圖可以看到,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
    iOS
    +關注

    關注

    8

    文章

    3393

    瀏覽量

    150446
  • 資源
    +關注

    關注

    0

    文章

    59

    瀏覽量

    17775

原文標題:iOS 中 Pod 庫資源引用探究

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用GCC編譯STM32F1,makefile引用.a報錯的原因?

    使用STcube生成了一個基于GCC便于的工程且編譯完成。 現在想加入自己的.a文件,進行如下操作: 1)在main函數中加入.a的頭文件; 2)引用.a
    發表于 04-07 06:09

    請問怎么引用DSP 6747 RTS實時?

    您好 請問怎么引用DSP 6747 RTS實時?ti.targets.rts6000.ae674 這個是什么文件?RTS6740.lib 這個呢?到底怎么引用這種文件?然后 需要
    發表于 08-02 09:28

    iOS靜態和動態的區別

    iOS 靜態(靜態依賴、三方依賴、資源處理等)
    發表于 06-17 07:03

    大量的iOS開發資源匯總

    這里收集了大量的iOS開發資源,幾乎是網上最全的呢,包括大量的開發案例、接口以及類,分享給大家,希望大家喜歡。
    發表于 07-11 07:50

    Pod資源配置

    《Kubernetes進階實戰》第四章《管理Pod資源對象》
    發表于 10-22 14:39

    在OpenHarmony library如何引用本地har

    我在devstudio 的library引用本地har, build時報如下錯誤:Error:The HAR generated by the library project
    發表于 04-02 15:21

    在HarmonyOS模塊引用本地har包編譯報錯的解決措施

    問題現象在HarmonyOS模塊引用本地的har包,編譯時提示“HAR_DEPENDENCY_ERROR”錯誤信息,如下圖所示:解決措施HarmonyOS
    發表于 04-13 14:33

    iOS系統怎樣解決循環引用

    稍有常識的人都知道在 iOS 開發時,我們經常會遇到循環引用的問題,比如兩個強指針相互引用,但是這種簡單的情況作為稍有經驗的開發者都會輕松地查找出來。 但是遇到下面這樣的情況,如果只看其實現代碼,也
    發表于 09-26 10:07 ?0次下載
    <b class='flag-5'>iOS</b>系統<b class='flag-5'>中</b>怎樣解決循環<b class='flag-5'>引用</b>

    各類iOS項目中組織代碼的方法分析

    ://git.coding.net/xxx/specs.git# Coding等私有Git托管平臺 # iOS版本支持 # platform :ios, 7.0 # 開發的子項目 # pod
    發表于 09-26 11:38 ?0次下載

    一些非常有用的iOS開源

    的最好的用戶體驗。 用了這個,你只需要遵循一系列協議,iOS會優雅地接管你的collection view并且會正確、好看地顯示給用戶信息。很明顯,每個iOS項目都應該采用。 CocoaPods:
    發表于 09-26 14:31 ?0次下載
    一些非常有用的<b class='flag-5'>iOS</b>開源<b class='flag-5'>庫</b>

    Kubernetes組件pod核心原理

    的 IP 地址和主機名 hostname,利用 namespace 進行資源隔離,相當于一臺獨立沙箱環境; pod 相當于一臺獨立主機,內部可以封裝一個或多個容器(通常是一組相關的容器),內部容器之間
    的頭像 發表于 09-02 09:27 ?1802次閱讀

    pod底層網絡和數據存儲是如何進行的

    的 IP 地址和主機名 hostname,利用 namespace 進行資源隔離,相當于一臺獨立沙箱環境; pod 相當于一臺獨立主機,內部可以封裝一個或多個容器(通常是一組相關的容器),內部容器之間
    的頭像 發表于 09-24 11:35 ?1653次閱讀

    KubernetesPod簡易理解

    Pod是Kubernetes中非常重要的概念,也是Kubernetes管理的基本單位。正如其名,Pod像一個豌豆莢,可以容納多個container,擁有相同的IP地址。
    的頭像 發表于 02-15 10:44 ?1247次閱讀

    K8S API資源對象-CRD介紹

    在Kubernetes,像Pod、Service和Deployment這樣的資源是由內置的資源類型如Pod、Service和Deploym
    的頭像 發表于 08-08 10:21 ?1084次閱讀

    Pod是如何在底層實現的?如何使用Docker創建Pod

    剛開始接觸 Kubernetes 時,你學到的第一件事就是每個 Pod 都有一個唯一的 IP 和主機名,并且在同一個 Pod ,容器可以通過 localhost 相互通信。所以,顯而易見,一個
    的頭像 發表于 08-14 10:33 ?1250次閱讀
    <b class='flag-5'>Pod</b>是如何在底層實現的?如何使用Docker創建<b class='flag-5'>Pod</b>?