0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

iOS中Pod庫(kù)資源引用探究

Android編程精選 ? 來(lái)源:稀土掘金技術(shù)社區(qū) ? 2023-05-26 11:11 ? 次閱讀

前言

Cocoapods中Pod引用資源的方式有多種,不同的方式對(duì)資源的使用還是有區(qū)別的,但也有一定的規(guī)律,這里我用一個(gè)樣例工程來(lái)進(jìn)行說(shuō)明,樣例工程名叫:AssetsDemo,使用pod lib create AssetsDemo命令創(chuàng)建,目錄結(jié)構(gòu)如圖:

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

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

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

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

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

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

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

從上圖可以看到,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: 掘金 - 星的天空

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 文件
    +關(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
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用GCC編譯STM32F1,makefile引用.a庫(kù)報(bào)錯(cuò)的原因?

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

    請(qǐng)問(wèn)怎么引用DSP 6747 RTS實(shí)時(shí)庫(kù)?

    您好 請(qǐng)問(wèn)怎么引用DSP 6747 RTS實(shí)時(shí)庫(kù)?ti.targets.rts6000.ae674 這個(gè)是什么文件?RTS6740.lib 這個(gè)呢?到底怎么引用這種庫(kù)文件?然后 需要
    發(fā)表于 08-02 09:28

    iOS靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別

    iOS 靜態(tài)庫(kù)(靜態(tài)庫(kù)依賴(lài)、三方依賴(lài)、資源處理等)
    發(fā)表于 06-17 07:03

    大量的iOS開(kāi)發(fā)資源匯總

    這里收集了大量的iOS開(kāi)發(fā)資源,幾乎是網(wǎng)上最全的呢,包括大量的開(kāi)發(fā)案例、接口以及類(lèi)庫(kù),分享給大家,希望大家喜歡。
    發(fā)表于 07-11 07:50

    Pod資源配置

    《Kubernetes進(jìn)階實(shí)戰(zhàn)》第四章《管理Pod資源對(duì)象》
    發(fā)表于 10-22 14:39

    在OpenHarmony library如何引用本地har庫(kù)

    我在devstudio 的library引用本地har庫(kù), build時(shí)報(bào)如下錯(cuò)誤:Error:The HAR generated by the library project
    發(fā)表于 04-02 15:21

    在HarmonyOS庫(kù)模塊引用本地har包編譯報(bào)錯(cuò)的解決措施

    問(wèn)題現(xiàn)象在HarmonyOS庫(kù)模塊引用本地的har包,編譯時(shí)提示“HAR_DEPENDENCY_ERROR”錯(cuò)誤信息,如下圖所示:解決措施HarmonyOS庫(kù)
    發(fā)表于 04-13 14:33

    iOS系統(tǒng)怎樣解決循環(huán)引用

    稍有常識(shí)的人都知道在 iOS 開(kāi)發(fā)時(shí),我們經(jīng)常會(huì)遇到循環(huán)引用的問(wèn)題,比如兩個(gè)強(qiáng)指針相互引用,但是這種簡(jiǎn)單的情況作為稍有經(jīng)驗(yàn)的開(kāi)發(fā)者都會(huì)輕松地查找出來(lái)。 但是遇到下面這樣的情況,如果只看其實(shí)現(xiàn)代碼,也
    發(fā)表于 09-26 10:07 ?0次下載
    <b class='flag-5'>iOS</b>系統(tǒng)<b class='flag-5'>中</b>怎樣解決循環(huán)<b class='flag-5'>引用</b>

    各類(lèi)iOS項(xiàng)目中組織代碼的方法分析

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

    一些非常有用的iOS開(kāi)源庫(kù)

    的最好的用戶(hù)體驗(yàn)。 用了這個(gè)庫(kù),你只需要遵循一系列協(xié)議,iOS會(huì)優(yōu)雅地接管你的collection view并且會(huì)正確、好看地顯示給用戶(hù)信息。很明顯,每個(gè)iOS項(xiàng)目都應(yīng)該采用。 CocoaPods:
    發(fā)表于 09-26 14:31 ?0次下載
    一些非常有用的<b class='flag-5'>iOS</b>開(kāi)源<b class='flag-5'>庫(kù)</b>

    Kubernetes組件pod核心原理

    的 IP 地址和主機(jī)名 hostname,利用 namespace 進(jìn)行資源隔離,相當(dāng)于一臺(tái)獨(dú)立沙箱環(huán)境; pod 相當(dāng)于一臺(tái)獨(dú)立主機(jī),內(nèi)部可以封裝一個(gè)或多個(gè)容器(通常是一組相關(guān)的容器),內(nèi)部容器之間
    的頭像 發(fā)表于 09-02 09:27 ?1827次閱讀

    pod底層網(wǎng)絡(luò)和數(shù)據(jù)存儲(chǔ)是如何進(jìn)行的

    的 IP 地址和主機(jī)名 hostname,利用 namespace 進(jìn)行資源隔離,相當(dāng)于一臺(tái)獨(dú)立沙箱環(huán)境; pod 相當(dāng)于一臺(tái)獨(dú)立主機(jī),內(nèi)部可以封裝一個(gè)或多個(gè)容器(通常是一組相關(guān)的容器),內(nèi)部容器之間
    的頭像 發(fā)表于 09-24 11:35 ?1689次閱讀

    KubernetesPod簡(jiǎn)易理解

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

    K8S API資源對(duì)象-CRD介紹

    在Kubernetes,像Pod、Service和Deployment這樣的資源是由內(nèi)置的資源類(lèi)型如Pod、Service和Deploym
    的頭像 發(fā)表于 08-08 10:21 ?1122次閱讀

    Pod是如何在底層實(shí)現(xiàn)的?如何使用Docker創(chuàng)建Pod?

    剛開(kāi)始接觸 Kubernetes 時(shí),你學(xué)到的第一件事就是每個(gè) Pod 都有一個(gè)唯一的 IP 和主機(jī)名,并且在同一個(gè) Pod ,容器可以通過(guò) localhost 相互通信。所以,顯而易見(jiàn),一個(gè)
    的頭像 發(fā)表于 08-14 10:33 ?1307次閱讀
    <b class='flag-5'>Pod</b>是如何在底層實(shí)現(xiàn)的?如何使用Docker創(chuàng)建<b class='flag-5'>Pod</b>?