矢量圖在iOS中的應(yīng)用細(xì)節(jié)

對(duì)于矢量圖的調(diào)研, 最開始是始于對(duì)其占用iOS App的空間的好奇。筆者好奇一個(gè)問題: 利用矢量圖能不能幫助iOS App減少整體空間?

iOS其實(shí)在很早的時(shí)候就已經(jīng)支持矢量圖的應(yīng)用(XCode 6時(shí)代開始支持), 只不過因?yàn)榇蟛糠珠_發(fā)者沿用了以前@1x、@2x、@3x格式圖的習(xí)慣, 并沒有一個(gè)地方專門普及使用矢量圖。當(dāng)然, 還有另外一個(gè)原因就是iOS對(duì)復(fù)雜的矢量圖支持的不是很好。

本文并沒有特別深入的技術(shù)點(diǎn), 僅僅只是筆者做的幾個(gè)實(shí)驗(yàn)的總結(jié)和矢量圖基礎(chǔ)使用的教程普及~

矢量圖和iOS

關(guān)于矢量圖在iOS中的使用早在15年2月就有一篇博文介紹了它的使用 - iOS使用矢量圖的總結(jié)。筆者按照它的用法操作了一遍, 基本大同小異~ 針對(duì)該文章沒有涉及到的一些細(xì)節(jié), 筆者進(jìn)行一定程度的補(bǔ)充。

iOS中矢量圖的使用方法

筆者為了做一下簡(jiǎn)單的矢量圖實(shí)驗(yàn), 使用Sketch隨意拖了一個(gè)星星出來(lái)并導(dǎo)出一個(gè)PDF。(實(shí)際上UI繪制矢量圖的工具有很多很多, 這里不贅述。如果讀者懶得自己去導(dǎo)出, 可以直接挪用)

XCode支持矢量圖一定要放置在xcasset文件中才能夠生效, 操作步驟如下:

  1. 拖拽提前制作的PDF進(jìn)入XXX.xcassets中。
  2. 選擇Image Set下的參數(shù)選項(xiàng)Scale FactorsSingle VectorVector With Overrides
  3. 如果圖形不在框框中, 拖入框框中(XCode某些版本不能自動(dòng)對(duì)號(hào)入座)
iOS矢量圖使用

Vector With OverridesSingle Vector的增強(qiáng), 可以在放置完矢量圖之后繼續(xù)放置@1x、@2x和@3x的png格式的圖片。放置的png會(huì)優(yōu)先覆蓋矢量圖, 未放置對(duì)應(yīng)倍率圖片的設(shè)備才會(huì)使用矢量圖對(duì)應(yīng)生成的圖片。

矢量圖在iOS中的應(yīng)用原理

iOS對(duì)矢量圖的支持其實(shí)只是一種方便開發(fā)者的選擇, 本質(zhì)上在XCode編譯的階段矢量圖會(huì)自動(dòng)生成對(duì)應(yīng)Target的@1x,@2x和@3x的png格式圖像。在iOS實(shí)際運(yùn)行中使用的圖片實(shí)際上已經(jīng)是png格式的圖片了~

iOS下矢量圖工作原理

通俗的理解 - 放置在xcassets里的矢量圖會(huì)自動(dòng)根據(jù)設(shè)備編譯成對(duì)應(yīng)尺寸的圖片, 如果是Generic iOS Device則會(huì)自動(dòng)生成全尺寸的同名圖片。

PS: 自動(dòng)生成的@1x圖會(huì)和矢量圖的原始尺寸保持一致。

下圖為利用ThemeEngine打開的基于Generic iOS Device編譯出來(lái)的Assets.car文件

ThemeEngine下car文件

矢量圖能否減少空間

回歸到最初的問題, 到底使用矢量圖能不能幫助iOS App減少空間呢?

筆者用簡(jiǎn)單粗暴的實(shí)驗(yàn)來(lái)對(duì)比說(shuō)明, 步驟如下:

  1. 使用pdf原始文件編譯生成通用IPA
  2. 從生成的IPA文件中提取Asset.car文件
  3. 利用iOS Image Extractor提取Asset.car文件
  4. 將提取出來(lái)的@1x、@2x、@3x放置回工程, 并刪除原始pdf中重新編譯
  5. 對(duì)比步驟1生成的car文件和步驟4生成的car文件大小
  • 步驟一編譯car大小(僅PDF) - 115KB
  • 步驟四編譯car大小(僅3張圖) - 86KB
  • 測(cè)試PDF尺寸 - 20KB

在iOS8.3以下, 相同壓縮比例的條件下, 矢量圖是無(wú)法幫助App減少空間。但是在iOS8.3以上, 利用xcassets可以避免多余的資源圖片下載, 只下載對(duì)應(yīng)的倍率的圖片。因此, 嚴(yán)格意義下, 利用矢量圖并不能幫助App節(jié)省空間。

其實(shí)筆者使用的簡(jiǎn)單粗暴的方式在蘋果新的瘦身機(jī)制下是不成立的, 因?yàn)榫幾g生成的最終包不一定就是設(shè)備最終安裝的包。引用官方文檔App ThinningSlicing章節(jié)中的一段話:

In Xcode, specify target devices and provide multiple resolutions of images in the asset catalog.
You must use the asset catalog in order for resources to be sliced.

筆者未能完全參透這句話的意思, 只知道xcasset會(huì)根據(jù)不同的設(shè)備會(huì)有不同的解決方案, 但是不知道粒度會(huì)達(dá)到什么樣的程度。筆者嘗試過針對(duì)不同的模擬器編譯, 只會(huì)生成對(duì)應(yīng)的倍率圖, 但是上傳給App Store是通用格式的, 難道下載的過程中進(jìn)行了一定的處理? 這個(gè)就需要一臺(tái)越獄設(shè)備去驗(yàn)證了, 就靠各位讀者大大了~

PS: 對(duì)iOS如何控制多余資源圖片下載感興趣的童鞋們, 可以找一臺(tái)越獄設(shè)備, 將iOS 8.3以上的App給提取出來(lái)分析分析哈~ 記得分享哇~ \(o)/

題外探究之提取原理

筆者在對(duì)比大小的時(shí)候使用的iOS Image Extrator。 在使用過程中, 筆者對(duì)該工具的提取原理產(chǎn)生了那么一點(diǎn)點(diǎn)的好奇。筆者好奇xcasset的格式應(yīng)該是封閉不開放的, 該工具是怎么從Asset.car中提取圖片的, 難道該工具破解了Asset.car的格式?

既然iOS Image Extrator是開源的, 那么筆者就有必要去看一看究竟了~ iOS Image Extrator其實(shí)是基于開源庫(kù)iOS Asset Extrator開發(fā)實(shí)現(xiàn)的, 核心提取的功能是在iOS Asset Extrator庫(kù)下提取的, 筆者通過閱讀其源碼, 找到兩個(gè)核心方法exportToDirectory:exportThemeRendition:

通過閱讀這兩個(gè)方法的源代碼可以了解到這個(gè)庫(kù)的基本實(shí)現(xiàn)。exportToDirectory:方法有該庫(kù)核心的提取圖片的所有邏輯代碼。而exportThemeRendition:可以看出該庫(kù)支持的所有格式, 并且通過蘋果內(nèi)置的各個(gè)格式的Rendition類提取導(dǎo)出。

iOS Asset Extrator庫(kù)本質(zhì)上調(diào)用的是蘋果的私有API。在該系列API中, CUICommonAssetStorage負(fù)責(zé)存儲(chǔ)Asset資源的關(guān)鍵key, CUICatalog是承載了具體資源圖片信息的登記目錄。

<font color="red">回歸主題, 開源庫(kù)底層既然是蘋果API, 那么就基本是一個(gè)黑盒子了。筆者既不能從暴露的API中分析出car的格式, 又不能判斷iOS設(shè)備是否在執(zhí)行中解壓, 只好放棄</font>~

總結(jié)

矢量圖嚴(yán)格意義上并不能幫助減少App的空間, 但是卻使用起來(lái)非常的方便, 建議使用。iOS本質(zhì)上并不支持矢量圖, 但是在編譯階段會(huì)將矢量圖轉(zhuǎn)化成目標(biāo)設(shè)備對(duì)應(yīng)的尺寸圖, 同時(shí)會(huì)利用xcassets的特性在iOS8.3以上設(shè)備下支持部分資源下載, 帶到包瘦身的效果。每次都要讓UI給多個(gè)尺寸的圖, 肯定沒有給一張方便吧? 當(dāng)然, 前提是UI的童鞋是基于矢量圖工具制作的圖片的前提下~

參考文獻(xiàn)

  1. 知乎 - iOS對(duì)矢量圖片的支持如何?
  2. iOS使用矢量圖的總結(jié)
  3. App Thinning
  4. ThemeEngine
  5. iOS Image Extrator
  6. iOS Asset Extrator
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容