热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS组件化之给自己的组件添加资源文件

在 podspec 中,利用 source_files可以指定要编译的源代码文件。可是,当我们需要把图片、音频、NIB等资源打包进Pod时该怎么办呢? 1.如何把资源文件打包为.b

在 podspec 中,利用 source_files 可以指定要编译的源代码文件。可是,当我们需要把图片、音频、NIB等资源打包进 Pod 时该怎么办呢?

 1.如何把资源文件打包为.bundle文件?

通常我们都会用.bundle文件把资源文件打包,这里也一样,把你的图片、音频、NIB等资源文件先统一放在一个文件夹里,文件夹名称最好是你的组件名称加上bundle,然后修改文件夹后缀为.bundle,就得到了一个bundle文件;然后把.bundle文件放在与Classes同一级的文件夹下,如下图

iOS组件化之-给自己的组件添加资源文件

 2.如何在podspec文件里配置资源路径?

然后在podspec文件里通过s.resource指定你的资源文件路径,如果你的组件名称叫ICXMeumAssistant,那么你的bundle名称就可以叫ICXIntelligentAssistantBundle.bundle

在podspec文件里配置:

  s.resource     = 'ICXMeumAssistant/ICXIntelligentAssistantBundle.bundle'
 
Pod::Spec.new do |s|
  s.name             = 'ICXMeumAssistant'
  s.version          = '0.1.2'
  s.summary          = '将管家模块代码抽取成组件.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://git.icarbonx.com/ICX-iOS/ICXMeumAssistant'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { ' 吕佳珍' => 'lvjiazhen@icarbonx.com' }
  s.source           = { :git => 'https://git.icarbonx.com/ICX-iOS/ICXMeumAssistant.git', :tag => s.version.to_s }
  s.ios.deployment_target = '8.0'
  s.source_files = 'ICXMeumAssistant/Classes/**/*'
  s.resource     = 'ICXMeumAssistant/ICXIntelligentAssistantBundle.bundle'
  
  s.dependency 'MJExtension'
  s.dependency 'KILabel'
  s.dependency 'MJRefresh'
  s.dependency 'SDWebImage'
  s.dependency 'Masonry'
  s.dependency 'ICXPublicMarcoFile'
  s.dependency 'ICXPublicCategory'
  s.dependency 'ICXPublicTools'
  s.dependency 'ICXMBProgressHUDExtension'
  s.dependency 'TYAudio2WordsManager'
  s.dependency 'ICXUserInfoModule'
  s.dependency 'ICXWebViewModule'
  s.dependency 'ICX10Clock'
end

 

3.如何读取bundle里面的资源?

首先我们需要获取bundle,你是不是立即想到了NSBundle mainBundle ? 但是当你的 pod 库以 framework 形式被使用时,你的资源不是被拷贝到 mainBundle 下,而是被放到 pod 的最终产物—— framework里。此时,你必须保证自己在访问这个 framework 的 bundle,而不是主工程的。

我创建了一个NSBundle的类别文件

先获取framework 的 bundle,ICXMeumAssistantBundleClass是组件里的一个类文件:

+ (NSURL *)ma_AssistantLibraryBundleURL {
    //先获取framework 的 bundle
    NSBundle *bundle = [NSBundle bundleForClass:[ICXMeumAssistantBundleClass class]];
    return [bundle URLForResource:@"ICXIntelligentAssistantBundle" withExtension:@"bundle"];
}

然后再获取我们自己手动创建的bundle:

+ (instancetype) ma_AssistantBundle {
    //再获取我们自己手动创建的bundle
    return [self bundleWithURL:[self ma_AssistantLibraryBundleURL]];
}

 

获取到了我们存放资源文件的bundle文件以后,就可以访问资源文件了,比如获取名为imageName的图片:

+ (UIImage *)ma_AssistantImageNamed:(NSString *)imageName
{
    UIImage *loadingImage = [[UIImage imageWithContentsOfFile:[[self ma_AssistantBundle] pathForResource:[NSString stringWithFormat:@"%@@2x",imageName] ofType:@"png"]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    return loadingImage;
}

加载xib文件需要注意的是当你只是把xib文件放到.bundle文件里的话,那么加载xib文件就会一直报异常

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle (loaded)' with name 'TPDoctorIntroductionView' 

这是因为.bundle文件里只放了xib文件,并没有nib文件,需要进行一下转化:
在终端输入以下命令进行转化:

ibtool --errors --warnings --output-format human-readable-text --compile TPDoctorIntroductionView.nib TPDoctorIntroductionView.xib

如果提示你Xcode路径不对的话,再重置一下你的Xcode路径:

sudo xcode-select -switch /Applications/Xcode9.3.app/Contents/Developer

转化以后,路径下就多了同名的nib文件,但我目前不知道如果有多个xib怎么能通过一句命令全部生成nib

 

iOS组件化之-给自己的组件添加资源文件

然后加载xib文件就不会异常啦

+ (instancetype)doctorView{
 
    return [[NSBundle ma_AssistantBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][0];
}  

  加载国际化文件

+ (NSString *)ma_AssistantLocalizedStringForKey:(NSString *)key
{
    return [self ma_AssistantLocalizedStringForKey:key value:nil];
}

+ (NSString *)ma_AssistantLocalizedStringForKey:(NSString *)key value:(NSString *)value
{
    static NSBundle *bundle = nil;
    if (bundle == nil) {
        // (iOS获取的语言字符串比较不稳定)目前框架只处理en、zh-Hans、zh-Hant三种情况,其他按照系统默认处理
        NSString *language = [NSLocale preferredLanguages].firstObject;
        if ([language hasPrefix:@"en"]) {
            language = @"en";
        } else if ([language hasPrefix:@"zh"]) {
            if ([language rangeOfString:@"Hans"].location != NSNotFound) {
                language = @"zh-Hans"; // 简体中文
            } else { // zh-Hant\zh-HK\zh-TW
                language = @"zh-Hant"; // 繁體中文
            }
        } else {
            language = @"en";
        }
        
        // 从.bundle中查找资源
        bundle = [NSBundle bundleWithPath:[[NSBundle ma_AssistantBundle] pathForResource:language ofType:@"lproj"]];
    }
    value = [bundle localizedStringForKey:key value:value table:nil];
    return value;
}

 PS:这里说的只是我个人习惯用的一种方式,其实还可以使用resource_bundles的方式,但道理都是相同的,尽可能避免跟主工程访问冲 

 

 

推荐阅读
  • 移动–镜像y轴的视频文件剪辑原文:https://www. ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • Android实现彩信附件的添加与删除功能-本文实例讲述了Android实现彩信附件的添加与删除功能。分享给大家供大家参考,具体如下:添加附件在ComposeMessageActi ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • 1. Makesureyouhaveimake.(SeetheBUILDNOTESfileifyouwanttotrybuildingwi ... [详细]
  • 机位|成人_在成人影片里做17种姿势识别?大佬在线求助:训练集不够用!
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了在成人影片里做17种姿势识别?大佬在线求助:训练集不够用!相关的知识,希望对你有一定的参考价值。 ... [详细]
  • MTK的资源一直深受研发人诟病,几乎成为初入手MTK人的挥之不去的痛楚,主要是因为缺乏相关的专业管理工具。虽然有一些公司自己开发一些图片了, ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 我正在为我的Symfony2项目构建一个搜索功能,我为它编写了SQL,如下所示:SELECTdlc.title,dlc.description,dlc.keywordsFROMSh ... [详细]
  • 当程序到后台后,继续完成LongRunning Task 任务
    原文:http:blog.sina.com.cnsblog_7b9d64af0101cjci.html(2013-04-0921:27:24)我们知道, ... [详细]
author-avatar
手机用户2502877525
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有