美文网首页
iOS组件化 02 - 组件中图片资源管理方案优化

iOS组件化 02 - 组件中图片资源管理方案优化

作者: 一叶知秋的码拉松 | 来源:发表于2019-12-31 15:48 被阅读0次

往期回顾

iOS组件化 01 - 本地私有库的使用

1. 上期图片加载的问题

观察上一期的添加图片资源方式,能够让宿主工程成功显示图片的关键是通过指定NSBundle的路径,写死图片名称

SLSearchBar.m

从这里可以发现,加载资源图片有以下问题

  • 图片名称必须固定写死
  • 屏幕适配,需要添加代码判断选择 @2x 和 @3x
  • 不同分辨率图片会全部打包进SLBaseKit.bundle

2. 解决方案

思路:

  • 我们熟知平常用的 @2x @3x 图片是为了缩小用户最终下载时包的大小
  • 通常我们会将图片放在 .xcassets 文件中管理,新建的项目也默认创建
Images.xcassets

使用 .xcassets 优点:

  • 方便在 Xcode 中查看和拖入图片
  • .xcassets 最终会打包生成为 Assets.car 文件
  • 对于 Assets.car 文件,App Slicing 会为切割留下符合目标设备分辨率的图片,可以缩小用户最终下载的包的大小。

FYI: Xcode Ref Asset Catalog Format App thinning overview (iOS, tvOS, watchOS)

实际上,随着 CocoaPods 不断的更新,resource_bundles 已经可以很好的支持 .xcassets

操作步骤
(1)在组件模板中创建Asset Catalog

Select Asset Catalog Resource

(2)输入名称:Assets.xcassets【保持统一Apple的命名规范, 可根据自己需求修改】,然后指定存放路径

Assets.xcassets
new Assets.xcassets

(3)将图片资源拖入到Assets.xcassets,删除之前的图片资源

add png to Assets.xcassets

(4)修改代码

//    NSString *searchBarImagePath = [[self currentBundle] pathForResource:@"searchbar_textfield_background@2x" ofType:@"png"];
//    UIImage *searchBarImage = [UIImage imageWithContentsOfFile:searchBarImagePath];
    UIImage *searchBarImage = [UIImage imageNamed:@"searchbar_textfield_background"
                                         inBundle:[self currentBundle]
                    compatibleWithTraitCollection:nil];

//    ... 

//    NSString *searchIconImagePath = [[self currentBundle] pathForResource:@"searchbar_textfield_search_icon@2x" ofType:@"png"];
//    searchIcon.image = [UIImage imageWithContentsOfFile:searchIconImagePath];
    searchIcon.image = [UIImage imageNamed:@"searchbar_textfield_search_icon"
                                  inBundle:[self currentBundle]
             compatibleWithTraitCollection:nil];

(5)修改SLBaseKit.podspec

# 资源文件路径
s.resource_bundles = {
    # 'SLBaseKit' => ['SLBaseKit/Assets/*.png'] 
    'SLBaseKit' => ['SLBaseKit/Assets/*.{.xcassets}']
  }

(6)打开终端

pod install

(7)观察 Xcode 导航栏视图


Assets.xcassets

(8)编译 Example 工程,观察 SLBaseKit_Example.app 的包内容里的资源包

Show in Finder open ../Products/Debug-iphoneos/SLBaseKit_Example.app/ open ../SLBaseKit_Example.app/Frameworks/SLBaseKit.framework/SLBaseKit.bundle ../SLBaseKit.bundle/Assets.car

(9)运行验证成功通过。

3. 总结

组件开发工程中,通过 .xcassets 管理图片资源,有以下几处优点

  • 代码中初始化图片,不再需作屏幕适配而写死 xx@2x.png 或 xx@3x.png 的图片全名称
  • 图片资源打包后统一在Assets.car文件中,不再是散落成图片文件
  • 支持 App Slicing 图片自动压缩优化,缩小用户最终下载的包的大小
  • Assets.xcassets可视化的设置图片的拉伸、渲染等属性
  • 支持.xib.storyboard预览图片(这个后面会讲)

相关文章

  • iOS组件化 03 - xib和Storyboard的使用

    往期回顾 iOS组件化 01 - 本地私有库的使用iOS组件化 02 - 组件中图片资源管理方案优化 1. 使用...

  • iOS组件化 02 - 组件中图片资源管理方案优化

    往期回顾 iOS组件化 01 - 本地私有库的使用 1. 上期图片加载的问题 观察上一期的添加图片资源方式,能够让...

  • 组件化方案

    组件化方案引用 在现有工程中实施基于CTMediator的组件化方案 iOS组件化实践(一):简介 iOS组件化实...

  • iOS组件化方案

    iOS组件化方案 iOS组件化方案

  • iOS组件化文章汇总

    iOS应用架构谈 组件化方案 APP组件化之路 我所理解的组件化之路 iOS 组件化方案探索 围观神仙打架,反革命...

  • iOS 组件化/模块化文章

    1.博客文章总结 iOS组件化思路-大神博客研读和思考iOS组件化实践方案-LDBusMediator炼就组件化架...

  • ios 组件化

    参考 iOS 组件化实践《二》基于现有项目拆分组件化实践 在现有工程中实施基于CTMediator的组件化方案 i...

  • iOS组件化

    0.ios组件化/模块化1.iOS 组件化开发项目框架设计2.iOS 组件二进制化方案3.组件化4.Seemygo...

  • iOS组件化 文章

    iOS组件化 BeeHive iOS应用架构谈 组件化方案 Small iOS BeeHive —— 一个优雅但还...

  • 07 CTMediator iOS组件化方案

    关于iOS组件化方案在Casa的iOS应用架构谈 组件化方案写得已经很清楚了。方案本身并不难,CTMediator...

网友评论

      本文标题:iOS组件化 02 - 组件中图片资源管理方案优化

      本文链接:https://www.haomeiwen.com/subject/wfqmoctx.html