使用asset catalog管理图片资源
每年6月份的苹果开发者大会上,都会有一些新的技术被发布出来,这些新技术虽然初看比较高冷,但稍微一研读就会发现,大多数都是那种make life easy
的很实用的技术,它要么能让我们写更好的代码,要么能让我们更好的写代码。总之,请不要害怕变化,大胆的去尝试吧。
题外话到此,下面进入正题。
asset catalog
是苹果在2014年也就是iOS7
系统上引入的用于APP内资源管理的辅助文件,我们可以把之前扔到bundle或者文件夹的图片或者其他资源放入asset catalog
中,由它来帮我们管理资源,除了管理上的便利意外,它还能够带来另一个很大的实惠:他能帮助我们实现APP瘦身(APP Thinning
)。
目前主要通过两种途径来实现瘦身:
首先,使用asset catalog
能为不同的平台、不同设备甚至相同类型的设备但是不同的配置(比如内存大小等)提供定制化的资源供给的解决方案,提供不同资源,当用户下载APP的时候,只有该用户的设备需要的资源才会被下载下来,这样就减小了用户下载的包的大小:
对于游戏开发者而言,它还能提供对于资源的按需下载的功能(on demand resource
or app slicing
),通过对资源进行标记,能够让用户在一开始下载APP的时候,可以下载一个尺寸较小的包,而随着玩家打怪升级比如需要进入下一关,才下载下一关所需的资源。
asset catalog
提供对图片和通用类型数据(generic data
)的管理,对于通用资源的管理,这里简单提一下:你可以把你的APP需要使用的文本、二进制或者其他格式的文件拖进去,然后指定一下文件类型,就可以通过asset catalog来管理了。这里我们主要讨论的是它对图片的管理能力。
可以通过Xcode
像其他文件一样方便的创建和使用。如下图:
通过打开文件夹我们可以看见asset catalog
的真面目:它实际上并不是一种新类型的文件,而是一个文件夹,而文件夹里面存放的也都是常见的文件:子文件夹、我们放入管理的图片和管理图片真实名称和使用名称的映射。
打开一个json
文本文件,我们就看到了asset catalog
的核心了:它实际上就是用一个配置文件保存我们所有的关于这张图片的信息:
关于asset catalog
的使用,自己动手去用一用立马就明白了,下面仅罗列出一些小技巧:
1. 如何解决多个asset catalog
中的同名图片资源的冲突问题:
首先j建议从根源上杜绝的话,可以对每个image set
使用模块统一的前缀,虽然有些繁琐,但对于资源的规范、后期的维护是一劳永逸的。
另外一个方法就是在asset catalog
中使用命名空间namespace
:如下图
然后在使用图片的时候需要带上命名空间前缀:
imageView.image = [UIImage imageNamed:@"folder1/Image"];
- 如何对
asset catalog
管理的图片进行未使用图片过滤。因为asset catalog
都是简单的文件夹+配置文件的方式,因此可以编写脚本完成这种过滤。比如这里提供了一些脚本或者直接看一段代码:
#!/bin/bash
for i in `find . -name "*.imageset"`; do
file=`basename -s .imageset "$i"`
result=`ack -i "$file" --ignore-dir="*.xcassets"`
if [ -z "$result" ]; then
echo "$i"
fi
done
- 利用
asset catalog
存储图片直接给某张图片设置可拉伸区域,这样你在代码里使用这张图片的时候就不用手动设置(具体怎么使用):
如下这段代码就可以省略了:
UIImage *originalImage = [UIImage new];
UIImage *stretchImage = [originalImage resizableImageWithCapInsets:UIEdgeInsetsMake(0.1, 0.1, 0.1, 0.1) resizingMode:UIImageResizingModeStretch];
- 利用
asset catalog
你可以给不同设配、不同配置、甚至不同屏幕状态的机型匹配不同的图片:
示例1. 为不同机型添加不同的配置图片
示例2. 为iPhone机型的1GB和2GB内存版本添加不同的图片
实例3. 为不同屏幕宽度的设备配置不同的图片(需要autolayout + sizeclass的支持)
5. 利用asset catalog
可以将图片直接配置成model image
,然后添加上不同的渲染颜色: