iOS 组件化加载 图片、gif、xib等文件(OC/Swift)

前言

xcode 15.3
ios 10.0

起因,因为公司要使用保利威视的视频使用,我拿来他们的Module来封装做成组件来用,但是他们的xib文件一直是nil,为此困扰了我好久

说明

在组件化中,你的.assets中的图片,文件夹中的图片、gif图片,xib文件,json文件等都需要进行处理,否则找不到文件,加载不了,都会为nil,

1、在podspec设置生成bundle文件

在你的组件化文件pod -> .podspec文件中设置
PolyvOpenSourceModule/Assets.xcassets: 设置加载Assets.xcassets中的图片
PolyvOpenSourceModule//.xib:设置加载xib文件
PolyvOpenSourceModule/Images/
: 设置加载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 文件中设置的一致

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 文件中设置的一致, 上面有说明,此处就不再次说明

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 文件中设置的一致

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 加载动图,如果你要加载json文件,自己拆开做吧,按照oc处理,应该不难的

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)

其余有空补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容