前言
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ǔ)充