0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

iOS中Pod库资源引用探究

Android编程精选 来源:稀土掘金技术社区 2023-05-26 11:11 次阅读

前言

Cocoapods中Pod引用资源的方式有多种,不同的方式对资源的使用还是有区别的,但也有一定的规律,这里我用一个样例工程来进行说明,样例工程名叫:AssetsDemo,使用pod lib create AssetsDemo命令创建,目录结构如图:

b0dcbe7c-fb6a-11ed-90ce-dac502259ad0.jpg

这个pod很简单,Classes目录只有一个cell的swift和xib文件,Assets目录有一些图片资源,其中的TestTableViewCell.xib使用了这张test图片。目录结构如下:

├──Assets
│├──Images.xcassets
││├──Contents.json
││└──test.imageset
││├──Contents.json
││├──test@2x.png
││└──test@3x.png
│├──test1@2x.png
│└──test1@3x.png
└──Classes
├──TestTableViewCell.swift
└──TestTableViewCell.xib

前期工作已经准备完毕,下面说下xib和图片资源不同使用方式下的区别:

将xib放入source_files,图片放入resource_bundles

在podspec的写法如下:

s.source_files='AssetsDemo/Classes/**/*'
s.resource_bundles={
'AssetsDemo'=>['AssetsDemo/{Assets,Classes}/**/*.{xcassets,png}']
}

运行后会生成这样的framework:

b0e86088-fb6a-11ed-90ce-dac502259ad0.jpg

我们可以看到,xib后缀会变成nib,并被放入framework中,而图片资源被放入了AssetsDemo.bundle中。

这样的结构,显然在常规情况下,xib是没法找到图片并显示的。但是有一种有缺陷的用法可以勉强解决这个问题,那就是直接把png图片打包到AssetsDemo.bundle中,然后在xib中将图片名改为AssetsDemo.bundle/图片名。这样做会导致xib编辑时无法正确的显示图片,也没法使用xcassets目录来存储图片,并且会导致一些系统优化无法生效。不推荐这样使用。

将xib和图片都放入resources

在podspec的写法如下:

s.source_files='AssetsDemo/Classes/**/*.swift'
s.resources='AssetsDemo/{Assets,Classes}/**/*.{xcassets,png,xib}'

网上有说法使用resources来指定资源,被指定的资源只会简单的被 copy到目标工程中(主工程),资源的使用会简化,但是会与主工程同名资源文件产生冲突。但是在Xcode13和pod 1.11.2版本下,实测不是这样的。官方的文档也不是这样说的Podspec Syntax Reference v1.11.2[1],它是分静态库和动态库场景,静态库才有这类问题。

上述配置运行后会生成这样的framework结构:

b0f23784-fb6a-11ed-90ce-dac502259ad0.jpg

从上图可以看到,资源被直接放入了所在的framework,另外查看主工程的包文件,是没有这些资源的。综上所述,可以得出结论,动态库中,resources指定的资源,会被直接copy到framework,不会与主工程资源文件冲突。

另外,由于xib文件TestTableViewCell.nib和Assets.car在同一个目录下,xib可以直接从Assets.car中找到图片资源并正确展示

在主工程中打开这个xib文件,如果主工程中有同名资源,那么编辑时会优先显示主工程的资源,但是实际运行时还是这个pod的资源。

这里xib可以放入source_files和resources,效果是一样的

将xib和图片都放入resource_bundles

在podspec的写法如下:

s.source_files='AssetsDemo/Classes/**/*.swift'
s.resource_bundles={
'AssetsDemo'=>['AssetsDemo/{Assets,Classes}/**/*.{xcassets,png,xib}']
}

上述配置运行后会生成这样的framework结构:

b0fa7fb6-fb6a-11ed-90ce-dac502259ad0.jpg

从上图可以看到,xib文件TestTableViewCell.nib和Assets.car在同一个目录下,xib可以直接从Assets.car中找到图片资源并正确展示。其中,test1图片虽然没有以xcassets格式引入,但是也能直接找到并正确展示。

总结

综上所述,我们可以得出一个原则:尽量让xib和xcassets与图片在同一个目录下,这样xib可以直接找到图片并正常展示。

关于resources和resource_bundles,在动态库下,他们最终效果差不多,只是resource_bundles会把资源封装在bundle中,使用的时候会稍微麻烦一点:

//使用resources的情况:
letmyBundle=Bundle(for:TestTableViewCell.self)
tableView.register(UINib.init(nibName:"TestTableViewCell",bundle:myBundle),
forCellReuseIdentifier:"cell")

//使用resource_bundles的情况:
letmyBundle=Bundle(for:TestTableViewCell.self)
letpath=myBundle.path(forResource:"AssetsDemo",ofType:"bundle")!
letassetsBundle=Bundle.init(path:path)
tableView.register(UINib.init(nibName:"TestTableViewCell",bundle:assetsBundle),
forCellReuseIdentifier:"cell")

至于静态库,则推荐使用resource_bundles了。综合来看,不管是静态库还是动态库,都推荐使用resource_bundles来引入所有的资源,因为resources方式在静态库和动态库场景,资源的使用方法差异太大,而resource_bundles各场景是一致的。

至于source_files,它只能引入代码和xib文件,不支持引入图片等其它资源。不建议用source_files方式引入xib,如果一定要使用,要注意避免出现xib中图片无法加载的问题。

by: 掘金 - 星的天空

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 文件
    +关注

    关注

    1

    文章

    561

    浏览量

    24692
  • 命令
    +关注

    关注

    5

    文章

    678

    浏览量

    21981
  • 静态库
    +关注

    关注

    0

    文章

    21

    浏览量

    7420
  • iOS
    iOS
    +关注

    关注

    8

    文章

    3393

    浏览量

    150427
  • 资源
    +关注

    关注

    0

    文章

    59

    浏览量

    17775

原文标题:iOS 中 Pod 库资源引用探究

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用GCC编译STM32F1,makefile引用.a报错的原因?

    使用STcube生成了一个基于GCC便于的工程且编译完成。 现在想加入自己的.a文件,进行如下操作: 1)在main函数中加入.a的头文件; 2)引用.a
    发表于 04-07 06:09

    请问怎么引用DSP 6747 RTS实时?

    您好 请问怎么引用DSP 6747 RTS实时?ti.targets.rts6000.ae674 这个是什么文件?RTS6740.lib 这个呢?到底怎么引用这种文件?然后 需要
    发表于 08-02 09:28

    iOS静态和动态的区别

    iOS 静态(静态依赖、三方依赖、资源处理等)
    发表于 06-17 07:03

    大量的iOS开发资源汇总

    这里收集了大量的iOS开发资源,几乎是网上最全的呢,包括大量的开发案例、接口以及类,分享给大家,希望大家喜欢。
    发表于 07-11 07:50

    Pod资源配置

    《Kubernetes进阶实战》第四章《管理Pod资源对象》
    发表于 10-22 14:39

    在OpenHarmony library如何引用本地har

    我在devstudio 的library引用本地har, build时报如下错误:Error:The HAR generated by the library project
    发表于 04-02 15:21

    在HarmonyOS模块引用本地har包编译报错的解决措施

    问题现象在HarmonyOS模块引用本地的har包,编译时提示“HAR_DEPENDENCY_ERROR”错误信息,如下图所示:解决措施HarmonyOS
    发表于 04-13 14:33

    iOS系统怎样解决循环引用

    稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来。 但是遇到下面这样的情况,如果只看其实现代码,也
    发表于 09-26 10:07 0次下载
    <b class='flag-5'>iOS</b>系统<b class='flag-5'>中</b>怎样解决循环<b class='flag-5'>引用</b>

    各类iOS项目中组织代码的方法分析

    ://git.coding.net/xxx/specs.git# Coding等私有Git托管平台 # iOS版本支持 # platform :ios, 7.0 # 开发的子项目 # pod
    发表于 09-26 11:38 0次下载

    一些非常有用的iOS开源

    的最好的用户体验。 用了这个,你只需要遵循一系列协议,iOS会优雅地接管你的collection view并且会正确、好看地显示给用户信息。很明显,每个iOS项目都应该采用。 CocoaPods:
    发表于 09-26 14:31 0次下载
    一些非常有用的<b class='flag-5'>iOS</b>开源<b class='flag-5'>库</b>

    Kubernetes组件pod核心原理

    的 IP 地址和主机名 hostname,利用 namespace 进行资源隔离,相当于一台独立沙箱环境; pod 相当于一台独立主机,内部可以封装一个或多个容器(通常是一组相关的容器),内部容器之间
    的头像 发表于 09-02 09:27 1800次阅读

    pod底层网络和数据存储是如何进行的

    的 IP 地址和主机名 hostname,利用 namespace 进行资源隔离,相当于一台独立沙箱环境; pod 相当于一台独立主机,内部可以封装一个或多个容器(通常是一组相关的容器),内部容器之间
    的头像 发表于 09-24 11:35 1651次阅读

    KubernetesPod简易理解

    Pod是Kubernetes中非常重要的概念,也是Kubernetes管理的基本单位。正如其名,Pod像一个豌豆荚,可以容纳多个container,拥有相同的IP地址。
    的头像 发表于 02-15 10:44 1239次阅读

    K8S API资源对象-CRD介绍

    在Kubernetes,像Pod、Service和Deployment这样的资源是由内置的资源类型如Pod、Service和Deploym
    的头像 发表于 08-08 10:21 1080次阅读

    Pod是如何在底层实现的?如何使用Docker创建Pod

    刚开始接触 Kubernetes 时,你学到的第一件事就是每个 Pod 都有一个唯一的 IP 和主机名,并且在同一个 Pod ,容器可以通过 localhost 相互通信。所以,显而易见,一个
    的头像 发表于 08-14 10:33 1246次阅读
    <b class='flag-5'>Pod</b>是如何在底层实现的?如何使用Docker创建<b class='flag-5'>Pod</b>?