iOS 組件化加載 圖片、gif簿盅、xib等文件(OC/Swift)

前言

xcode 15.3
ios 10.0

起因挥下,因?yàn)楣疽褂帽@暤囊曨l使用,我拿來他們的Module來封裝做成組件來用桨醋,但是他們的xib文件一直是nil棚瘟,為此困擾了我好久

說明

在組件化中,你的.assets中的圖片讨盒,文件夾中的圖片解取、gif圖片,xib文件返顺,json文件等都需要進(jìn)行處理禀苦,否則找不到文件,加載不了遂鹊,都會(huì)為nil振乏,

1、在podspec設(shè)置生成bundle文件

在你的組件化文件pod -> .podspec文件中設(shè)置
PolyvOpenSourceModule/Assets.xcassets: 設(shè)置加載Assets.xcassets中的圖片
PolyvOpenSourceModule//.xib:設(shè)置加載xib文件
PolyvOpenSourceModule/Images/
: 設(shè)置加載Module -> Images文件夾中的圖片秉扑、gif圖片慧邮、json文件等

  s.resource_bundles = {
    'Polyv_bundles' => ['PolyvOpenSourceModule/Assets.xcassets', 'PolyvOpenSourceModule/**/*.xib', 'PolyvOpenSourceModule/Images/*']
  }

2、在組件中加載文件

2.1舟陆、Objective-C

2.1.1 首先生成 NSBundle文件

FADeviceAssets.h 封裝

+ (NSBundle *)hj_ResourceBundle;

FADeviceAssets.m 注意误澳,此處的bundle文件名要和 .podspec 文件中設(shè)置的一致

static NSBundle *resourceBundle = nil;
static dispatch_once_t onceToken;

+ (NSBundle *)hj_ResourceBundle {
   dispatch_once(&onceToken, ^{
       NSString *resourceBundlePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Polyv_bundles" ofType:@"bundle"];
       resourceBundle = [NSBundle bundleWithPath:resourceBundlePath];
   });
   return resourceBundle;
}

2.1.2 加載圖片

封裝加載方法

@interface UIImage (Category)
+ (instancetype)hj_imageDevice:(NSString *)name;
@end


@implementation UIImage (Category) 
+ (instancetype)hj_imageDevice:(NSString *)name {
   return [UIImage imageNamed:name inBundle:[FADeviceAssets hj_ResourceBundle] compatibleWithTraitCollection:nil];
} 
@end

圖片加載

UIImageView * imageView = [[UIImageView alloc] init];
imageView.image = [UIImage hj_imageDevice:@"FADevice_second_bg"]; 

2.1.3 gif 圖片加載

此處我使用的是 FLAnimatedImage 加載本地gif

@interface FLAnimatedImage (Category)
+ (instancetype)hj_gif:(NSString *)name;
@end

@implementation FLAnimatedImage (Category) 
+ (instancetype)hj_gif:(NSString *)name {
    NSBundle * subBundle = [FADeviceAssets hj_ResourceBundle];
     
    NSURL * url = [subBundle URLForResource:name withExtension:@"gif"];
    NSData * imageData = [NSData dataWithContentsOfURL:url];
    return [FLAnimatedImage animatedImageWithGIFData:imageData];
} 
@end

加載方法

 FLAnimatedImageView * imageView = [[FLAnimatedImageView alloc] init];
 imageView.image = [UIImage hj_imageDevice:@"FADevice_second_auto"];

2.1.4 解析json

NSURL * url = [[FADeviceAssets hj_ResourceBundle] URLForResource:name withExtension:@"json"];
NSData * imageData = [NSData dataWithContentsOfURL:url];
NSDictionary * json = [NSJSONSerialization JSONObjectWithData:imageData options:NSJSONReadingMutableContainers error:nil];

2.1.5 加載 xib

此處也是我遇到的問題所在,頭都給快給我整禿了

此處是原來加載的xib代碼秦躯,無法加載

PLVVodPlayerSkin *skin = [[PLVVodPlayerSkin alloc] initWithNibName:nil bundle:nil];

更改后的

PLVVodPlayerSkin *skin = [[PLVVodPlayerSkin alloc] initWithNibName:@"PLVVodPlayerSkin" bundle:[FADeviceAssets hj_ResourceBundle]];

2.2 Swift

2.2.1 swift 加載圖片

注意忆谓,此處的bundle文件名要和 .podspec 文件中設(shè)置的一致, 上面有說明,此處就不再次說明

extension UIImage {
    class func yl_image(named name: String) -> UIImage{
        return YLStudyAssets.bundledImage(named: name)
    }
}

open class YLStudyAssets: NSObject {
    internal class func bundledImage(named name: String) -> UIImage {
        let primaryBundle = Bundle(for: YLStudyAssets.self)
        if let image = UIImage(named: name, in: primaryBundle, compatibleWith: nil) {
            return image
        } else if
            let subBundleUrl = primaryBundle.url(forResource: "Polyv_bundles", withExtension: "bundle"),
            let subBundle = Bundle(url: subBundleUrl),
            let image = UIImage(named: name, in: subBundle, compatibleWith: nil){
            return image
        }
        return UIImage()
    }

}

圖片加載

let imageView = UIImageView()
imageView.image = UIImage.yl_image(named: "")

2.2.2 加載gif圖片

此處使用FLAnimatedImage加載踱承,注意倡缠,此處的bundle文件名要和 .podspec 文件中設(shè)置的一致

import FLAnimatedImage
extension FLAnimatedImage {
    class func yl_gif(named name: String) -> FLAnimatedImage {
        return YLStudyAssets.bundleGif(named: name)
    }
}

open class YLStudyAssets: NSObject {
    internal class func bundleGif(named name: String) -> FLAnimatedImage {
        let primaryBundle = Bundle(for: YLStudyAssets.self)
        
        if let subBundleUrl = primaryBundle.url(forResource: "YLStudy_bundles", withExtension: "bundle"),
           let subBundle = Bundle(url: subBundleUrl),
           let url = subBundle.url(forResource: name, withExtension: "gif"),
           let imageData = try? Data(contentsOf: url) { 
                return FLAnimatedImage(animatedGIFData: imageData)
        }
        return FLAnimatedImage()
    }
}

gif圖片加載

    private lazy var imageIcon: FLAnimatedImageView = {
        let imageView = FLAnimatedImageView() 
        imageView.animatedImage = FLAnimatedImage.yl_gif(named: "voiceLeft")
        
        return imageView
    }()

2.2.3 加載json

我此處是使用lottie-ios 加載動(dòng)圖哨免,如果你要加載json文件,自己拆開做吧昙沦,按照oc處理琢唾,應(yīng)該不難的

let primaryBundle = Bundle(for: YLHomeAssets.self)
let subBundleUrl = primaryBundle.url(forResource: "YLHome_bundles", withExtension: "bundle")
let subBundle = Bundle(url: subBundleUrl!) ?? Bundle.main 
let animation = Animation.named(fileName, bundle: subBundle)

其余有空補(bǔ)充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盾饮,隨后出現(xiàn)的幾起案子采桃,更是在濱河造成了極大的恐慌,老刑警劉巖丘损,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芍碧,死亡現(xiàn)場離奇詭異,居然都是意外死亡号俐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門定庵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏饿,“玉大人,你說我怎么就攤上這事蔬浙≈砺洌” “怎么了病曾?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵熄诡,是天一觀的道長。 經(jīng)常有香客問我办成,道長俱病,這世上最難降的妖魔是什么官疲? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮亮隙,結(jié)果婚禮上途凫,老公的妹妹穿的比我還像新娘。我一直安慰自己溢吻,他們只是感情好维费,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著促王,像睡著了一般犀盟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝇狼,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天阅畴,我揣著相機(jī)與錄音,去河邊找鬼题翰。 笑死恶阴,一個(gè)胖子當(dāng)著我的面吹牛诈胜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯事,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焦匈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昵仅?” 一聲冷哼從身側(cè)響起缓熟,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摔笤,沒想到半個(gè)月后够滑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吕世,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年彰触,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片命辖。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡况毅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尔艇,到底是詐尸還是另有隱情尔许,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布终娃,位于F島的核電站味廊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棠耕。R本人自食惡果不足惜余佛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窍荧。 院中可真熱鬧衙熔,春花似錦、人聲如沸搅荞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咕痛。三九已至痢甘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茉贡,已是汗流浹背塞栅。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腔丧,地道東北人放椰。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓作烟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砾医。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拿撩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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