iOS 我所知道的Assets.xcassets

作者: 小沫360 | 来源:发表于2016-04-09 01:46 被阅读16380次

Assets.xcassets是用来存放图像资源文件的。将一个图片放在Assets里面是这个样子的


目录结构

Image Set

Image Set图像集,下面有个Name,这个Name并不是指图片的名字而是指像集的名字。什么意思?上个图说明一下,

Image Set

[UIImage imageNamed:@"xxx"]通常这里xxx就是相集的名字,在相集里面放两张不一样的@2x和@3x图片,在iPhone6和iPhone6 Plus加载出来的会不一样。

两个完全不一样的图片

Devices

Devices下面有很多设置具体效果可以参见demo请戳这里下载

1、设置相同的相集下面的显示不同的图片。比如一个APP是适配iPhone和iPad,在iPhone上显示A图片,在iPad上显示B图片,勾选上iPhone和iPad那么可以对iPhone和iPad单独设置图片

不同设备不同图片

2、根据sizeClass设置图片,比如6Plus在横屏的时候显示A图片,在竖屏的时候显示B图片那么久可以设置Devices下面的 WidthHeight

不同size不同图片

3、Memory和Graphics虽然我很想写,但是我真的不知道。还没用到过。希望知道的小伙伴可以留言告诉我。

4、 Scale Factors 可设置矢量图(Singele Vector)和位图(Vector wiht Overrides)

我们知道xcode可以放PDF格式的图片代替@2x,@3x图片,这样即使放大也不会失真

设置PDF矢量图片

5、 Render As 默认是Default还有两个分别是Oriminal Image(始终绘制图片原始状态,不使用Tint Color)Template Image(始终根据Tint Color绘制图片,忽略图片的颜色信息)

比如设置UITabBarItem中的图片的时候,默认情况下回对图片进行渲染成蓝色,(具体可以参照demo的第一个UITabBarItem),这个时候我们需要回复图片本来的颜色,这是图片的渲染为Oriminal Image就行了。
如果用代码实现的话,是这样

[[UITabBarItem alloc] initWithTitle:tittle image:[[UIImage imageNamed:@"image"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] selectedImage:[[UIImage imageNamed:@"selectedImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];

Image

图片的信息比如 文件名(File Name) 大小(Size)等等上面设置的信息

Slicing

这个是用来设置图片的拉伸的。例如QQ聊天的气泡,四个角不被拉伸,中间的可以拉伸。如果用代码实现的话,可以参考MJ的博客。在Assets.xcassets怎么实现呢?

QQ20160409-0.png 开始拉伸 选择拉伸方向

拖动图片上的三根线,Slicing的值会跟着改变,在左侧线和中间线之间的像素会在拉伸时被填充,在中间线和右侧线之间的像素将被隐藏。在上侧线和中间线之间的像素会在拉伸时被填充,在中间线和下侧线之间的像素将被隐藏。

拉伸参数 不被拉伸的区域

总结:

如果图片存放在assets资源管理器,最终里面所以的图片会被打包成Assets.car(用ThemeEngine可以把图片弄出来),其作用在于

1、 自动识别@2x,@3x图片,

2、 根据不同的设备,不同的分辨率设置相应的图片。

3、 可以对图片进行剪裁和拉伸处理

在.car中的图片是不能通过imageWithContentsOfFile:来加载
imageName:加载的图片要么是Assets.car中的图片,要么是资源包(mainBundle)中直接存放的图片。如果用imageNamed:从Images.xcassets以外的地方加载图片,必须在文件名后加扩展名,例如:

 UIImage *image=[UIImage imageNamed:@"plus.png"];

demo下载

相关文章

网友评论

  • 起个名字好难O0:点击show Slicing 拉伸之后. 然后系统就不分辨2x3x了. 连Plus都用2x的图片.怎么解决? 或者怎么关闭拉伸
  • coolLee:请教:将一个中文命名的图片直接拖入到Images.xcassets,然后修改相应的文件名为英文,此时showInFinder,看到的图片实际的名称依然是中文,这样子对程序有任何影响吗?
    findM:正常使用的话 并没有影响
  • 新地球说着一口陌生腔调:Assets.xcassets 在启动程序时会全部加载吗
  • Pusswzy:这种经常使用的东西 经常会被我忽略 感谢作者~
  • 夜空Star:楼主的demo下载不了,不知什么原因?
  • 崇山峻岭:"如果用imageNamed:从Images.xcassets以外的地方加载图片,必须在文件名后加扩展名", 这个是错误的观点,如楼下所说, 我也一直这么写的, 文章很好, 希望及时纠正错误内容, 避免误导小白, 大家一起进步
  • 沫toghayn丶in:最后一点 "如果用imageNamed:从Images.xcassets以外的地方加载图片,必须在文件名后加扩展名" 不对. 用imageNamed:从Images.xcassets以外的地方加载图片,png图片的扩展名也是可以省略的,我就是一直这么写的.
    夜空Star:同意。用imageNamed:从Images.xcassets以外的地方加载图片,png图片的扩展名也是可以省略的,我就是一直这么写的.
  • da27c260cc85:那个slicing 的九个线,你都试过了?
  • wokenshin:文章很好,多谢分享。Assets.xcassets太牛逼了。还可以自动兼容启动页和Appicon 只要给对size就可以了

本文标题:iOS 我所知道的Assets.xcassets

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