IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> iOS 组件化加载 图片、gif、xib等文件 -> 正文阅读

[移动开发]iOS 组件化加载 图片、gif、xib等文件

前言

xcode 15.3
ios 10.0

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

说明

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

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 加载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)

其余有空补充

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:22:54  更:2022-04-04 12:25:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:29:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码