前语
Cocoapods
中Pod
引证资源的方法有多种,不同的方法对资源的运用仍是有区别的,但也有必定的规律,这儿我用一个样例工程来进行说明,样例工程名叫:AssetsDemo
,运用pod lib create AssetsDemo
命令创立,目录结构如图:
这个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
:
咱们能够看到,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,它是分静态库和动态库场景,静态库才有这类问题。
上述装备运转后会生成这样的framework
结构:
从上图能够看到,资源被直接放入了地点的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
结构:
从上图能够看到,xib文件TestTableViewCell.nib
和Assets.car
在同一个目录下,xib
能够直接从Assets.car
中找到图片资源并正确展现。其间,test1
图片尽管没有以xcassets
格局引进,可是也能直接找到并正确展现。
总结
综上所述,咱们能够得出一个原则:尽量让xib
和xcassets
与图片在同一个目录下,这样xib能够直接找到图片并正常展现。
关于resources
和resource_bundles
,在动态库下,他们终究作用差不多,仅仅resource_bundles
会把资源封装在bundle
中,运用的时分会稍微麻烦一点:
// 运用resources的状况:
let myBundle = Bundle(for: TestTableViewCell.self)
tableView.register(UINib.init(nibName: "TestTableViewCell", bundle: myBundle),
forCellReuseIdentifier: "cell")
// 运用resource_bundles的状况:
let myBundle = Bundle(for: TestTableViewCell.self)
let path = myBundle.path(forResource: "AssetsDemo", ofType: "bundle")!
let assetsBundle = 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
中图片无法加载的问题。
参考资料
- Podspec Syntax Reference v1.11.2
- 关于 Pod 库的资源引证 resource_bundles or resources
by: 星的天空