iOS 元件化開發(三):載入資原始檔

LinXunFeng發表於2018-04-06

經過前兩篇文章的學習,相信對元件化開發有了大致的瞭解,那我們這篇文章就來講講資原始檔的載入吧

這裡我新建了一個LXFMain元件庫,主要是用來顯示TabBar的玩意,然後再進行元件化抽離出來,其中的過程這裡不再贅述,還沒了解過的同學建議先閱讀下這兩篇文章吧

iOS 元件化開發(一):遠端私有庫的基本使用

iOS 元件化開發(二):遠端私有庫的更新與子庫

這裡跟之前不一樣的地方在於多了圖片資源,元件的核心程式碼放在Classes資料夾中,而圖片我們則存放於Assets目錄下,如圖所示

存放位置

一、修改Spec

將關於資源載入的註釋去掉

s.resource_bundles = {
 # 'LXFMain' => ['LXFMain/Assets/*.png']
 'LXFMain' => ['LXFMain/Assets/*']
}
複製程式碼

回到LXFMain的模板庫,我們進行一次本地的安裝和測試(pod install)

iOS 元件化開發(三):載入資原始檔

可以看到,圖片資源也安裝進來了,但是執行的效果如下圖,圖片並不能成功載入出來

沒有圖示

二、修改載入資原始碼

這是當前載入圖片的相關程式碼

[UIImage imageNamed:@"圖片名稱"];
複製程式碼

show in finder

右擊顯示包內容

LXFMain.framework

圖片就在這個LXFMain.bundle裡面(這裡就不截圖看了),這裡主要是讓大家對這個目錄結構有個瞭解

我們對imageNamed進行跳轉到定義操作

imageNamed

// load from main bundle
複製程式碼

可以看到,官方註釋著imageNamed載入的是main bundle中的資源,mainBundle的位置如下圖

mainBundle

這樣當然就無法載入到圖片啦,我們需要讓它載入自己當前所在bundle裡的圖片 ,所以載入圖片的程式碼需要進行修改

NSString *normalImgName = @"個人@2x.png";
NSBundle *curBundle = [NSBundle bundleForClass:self.class]; // 獲取當前bundle
NSString *normalImgPath = [curBundle pathForResource:normalImgName ofType:nil inDirectory:@"LXFMain.bundle"];
UIImage *normalImage = [UIImage imageWithContentsOfFile:normalImgPath];
複製程式碼

但是直接寫LXFMain.bundle並不好,不可控,所以還需要改進一下:

NSString *normalImgName = [NSString stringWithFormat:@"%@@2x.png", normalImg];
NSBundle *curBundle = [NSBundle bundleForClass:self.class];
//  *********** 重點 ***********   //
NSString *curBundleName = curBundle.infoDictionary[@"CFBundleName"];
NSString *curBundleDirectory = [NSString stringWithFormat:@"%@.bundle", curBundleName];
NSString *normalImgPath = [curBundle pathForResource:normalImgName ofType:nil inDirectory:curBundleDirectory];
//  ***************************   //
UIImage *normalImage = [UIImage imageWithContentsOfFile:normalImgPath];
複製程式碼

成功載入

三、聊聊xib

Xib的載入也是如此

NSBundle *curBundle = [NSBundle bundleForClass:self.class];
LXFCenterView *centerView = (LXFCenterView *)[curBundle loadNibNamed:@"LXFCenterView" owner:nil options:nil].firstObject;
centerView.frame = CGRectMake(30, 140, 200, 100);
[self.view addSubview:centerView];
複製程式碼

不過xib中值得一提的是,如果是直接在xib中拖入一個imageView控制元件來設定圖片的載入,我們則需要在圖片名字前加上當前bundle名稱

LXFMain.bundle/個人
複製程式碼

這裡除了當前xib要載入的圖片不屬於mainBundle這個原因之外,還有一點就是xib檔案與bundle存放位置屬於同一級別,故直接使用相對路徑的方式,在圖片名字前加上bundle名稱即可。

同一目錄級別

xib上的操作

雖然無法在xib上直接看到效果,不過確實是有效的

xib成功顯示圖片

四、遇到的小問題

[!] Unable to find a pod with name, author, summary, or description matching `lxfmain`
複製程式碼

我做完一切操作後發現搜尋報上面那個錯,解決方案是刪除本地索引檔案,然後再搜尋一遍,系統會自動幫你再生成一切本地索引檔案,然後就搞定了~

rm -rf ~/Library/Caches/CocoaPods/search_index.json 
pod search lxfmain
複製程式碼

相關文章