在Android中,R.java文件管理資源闯参,引用的方式R.xx.xx瞻鹏,非常方便。swift也借鑒R的方式鹿寨,出了個(gè)庫(kù)R.swift新博,用起來(lái)也是簡(jiǎn)單明了,不用先找到image的名字脚草,像下面這樣寫(xiě)就好赫悄,并且會(huì)有自動(dòng)提示。
let icon = R.image.settingsIcon()
let font = R.font.sanFrancisco(size: 42)
let viewController = CustomViewController(nib: R.nib.customView)
let string = R.string.localizable.welcomeWithName("Arthur Dent")
原理說(shuō)起來(lái)也挺簡(jiǎn)單馏慨,用腳本掃出在project文件中引用的資源(不過(guò)R.swift腳本是個(gè)可執(zhí)行文件并沒(méi)有開(kāi)源)埂淮,然后生成R.generated.swift,文件中是各種資源的struct写隶。簡(jiǎn)化代碼如下:
struct R {
struct image {
static let favorIcon = Rswift.ImageResource(bundle:R.hostingBundle, name: "eerste")
static func favorIcon(compatibleWith traitCollection: UIKit.UITraitCollection? = nil) -> UIKit.UIImage? {
return UIKit.UIImage(resource: R.image.favorIcon, compatibleWith: traitCollection)
}
}
那么倔撞,以類似的思路,在oc中也可以實(shí)現(xiàn)一套慕趴。
思路
這里先只討論png圖片的引用痪蝇。
1.首先得有R文件,然后R類中得有image屬性冕房。
2.讀取project文件躏啰,找到所引用的圖片資源
3.遍歷資源,如果是png類型毒费,就生成相應(yīng)的代碼(包括接口和實(shí)現(xiàn))插入到RImage類中丙唧。
R文件
新建R class愈魏。添加image屬性觅玻,類型為RImage。
@interface R : NSObject
@property (noatomic) RImage *image;
@end
@interface RImage : NSObject
@end
讀取project文件
project文件是ruby語(yǔ)法培漏,cocoapods出過(guò)一個(gè)工具xcodeproj溪厘,可以來(lái)讀取修改project。
隨便打開(kāi)一個(gè)project文件牌柄,會(huì)發(fā)現(xiàn)資源在ResourcesBuildPhase節(jié)點(diǎn)中畸悬。
寫(xiě)ruby腳本讀取project文件:
require 'xcodeproj'
// project文件的路徑
project_path = 'xxx'
project = Xcodeproj::Project.open(project_path)
project.targets.each do |target|
puts target.name
end
# 默認(rèn)找第一個(gè)target
target = project.targets.first
# resources_build_phase
files = target.source_build_phase.files.to_a.map do |pbx_build_file|
pbx_build_file.file_ref.real_path.to_s
end.select do |path|
# 遍歷路徑,找到以png結(jié)尾的文件存起來(lái)
# xxx
end
插入代碼
要能用R.image.imageName返回到相應(yīng)的圖片珊佣,RImage中必須要添加相應(yīng)的imageName方法。
//RImage.h
- (UIImage *)favorIcon;
//RImage.m
- (UIImage *)favorIcon {
return [UIImage imageNamed:@"favorIcon" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil];
}
用ruby生成以上模板代碼,然后打開(kāi)RImage.h/RImage.m寫(xiě)入即可祝钢。
至此催跪,最簡(jiǎn)單的R.image就完成了。string/xib/storyboard的生成也類似惑艇。然后寫(xiě)個(gè)shell腳本調(diào)用前面的ruby文件蒿辙,在build phase中添加run script拇泛。
當(dāng)然,實(shí)際中比這會(huì)復(fù)雜很多思灌。
1俺叭、比如圖片一般都是放到xcassets,這樣就需要再遍歷xcassets里面的圖片泰偿。
2熄守、資源有時(shí)不會(huì)全放mainbundle中,會(huì)有自建的bundle甜奄,那么讀取圖片時(shí)需要指定bundle柠横。這就需要對(duì)bundle信息有記錄。
3课兄、jpg圖片牍氛。