iOS开发之技能点iOS开发实战Develop

浅谈iOS屏幕适配

2016-04-29  本文已影响3032人  流星大石头

在Google一些东西的时候,发现了这篇博文,觉得非常之好,就转载过来,非常感谢博主的分享精神。
博文原地址:http://liumh.com/2015/10/21/ios-image-related-matching/

iOS开发中,屏幕适配也是项很重要的工作,本文记录了一些在屏幕适配的过程中与图片相关的工作。

基本概念
Snip20160615_2.png

由上可以看出,所谓的屏幕模式,描述的就是屏幕中一个点有多少个 Rendered Pixels 渲染,对于2倍屏(又称 Retina 显示屏),会有 2 x 2 = 4 个像素的面积渲染,对于3倍屏(又称 Retina HD 显示屏),会有 3 x 3 = 9 个像素的面积渲染。

Snip20160615_3.png

例如:

MyImage.png - 1x 显示屏自动加载的图片版本

MyImage@2x.png - 2x 显示屏自动加载的图片版本

MyImage@3x.png - 3x 显示屏自动加载的图片版本

MyImage@2x~iphone.png - 2x iPhone 和 iPod touch 显示屏自动加载的图片版本

MyImage@3x~iphone.png - 3x iPhone and iPod 显示屏自动加载的图片版本

2x屏幕的设备会自动加载 xxx@2x.png 命名的图片资源,3x屏幕的设备会自动加载 xxx@3x.png 的图片, 现在基本没有 1x屏幕的设备了,可以不用提供这个分辨率的图片了。

研发工作流程
  1. 从中间尺寸向上和向下适配的时候界面调整的幅度最小。375pt下的设计效果适配到414pt和320pt偏差不会太大。假设以414pt为基准做出很优雅的设计,到320pt可能元素之间比例就不是那么回事了,比如图片和文字之间视觉比例可能失调。
  2. iPhone 6 plus有两种显示模式,标准模式分辨率为1242x2208,放大模式分辨率为1125x2001(即iPhone 6的1.5倍)。可见官方系统里iPhone 6和iPhone 6 plus分辨率之间就存在1.5倍的倍率关系。很多情况下这两种尺寸可以用1.5倍直接等比适配。
  3. 1242x2208这个奇葩的数值是苹果官方都不愿意公开宣传的一个分辨率,不便于记忆和计算栅格。640x1136虽然是广泛应用的一个分辨率,但是大屏时代依然以小尺寸为设计基准显然不合时宜,设计师会停留在小屏的视角做设计。所以,iPhone6的750x1334是最适合基准尺寸。`
图片的Resize处理
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

可以使用此方法生成一个新的图片,其参数 capInsets 是个结构体,可用

 UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)

定义,由 top,left,bottom,right 参数定义的区域在拉伸时会保持不变,其中 top、left、bottom、right 的单位都是 point ,以实例说明该方法的使用吧。

保持图片左边(包括下三角处)在图片的水平拉伸处理中保持原样不变,通过代码设置如下:

UIImage *img = [UIImage imageNamed:@"popup"];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 55) resizingMode:UIImageResizingModeStretch];
self.resizableImgView.image = img;

其中 CapInsets 的 left 值为 13 point,right 值为 55 point,这个值的确定需要根据具体图片其保持不变的区域来确定,目前,也可以通过 Xcode xcassets 的 Slicing 功能完成,如下图所示:


Xcode 中使用 Slicing 功能拉伸处理图片

Xcode 中使用 Slicing 功能拉伸处理图片

其中红色框 Slices 处可以控制该图片是水平拉伸(Horizontal),垂直拉伸(Vertical)或者水平垂直方向同时(Horizontal and Vertical)拉伸, 其值 Left 26,Right 110 单位是 pixels,我们通过API resizableImageWithCapInsets
设置时,需要联合红色框 Scale 处的值转换为单位为 point 的值,红色框 Center 处的值控制图片变换的方式,这里 Stretches 表示将 width 为 4 pixels 的图片区域进行拉伸,还有另一种方式 Tiles,表示将设置的区域进行平铺,这种方式稍后以实例2来说明。红色框 Slices 和 Center 处的数值可以直接改变输入框中的数值改变,也可以拖动左侧图片中的竖直虚线设置,可以自己试试。

将图片中五角星的图样进行平铺,通过代码设置如下:

UIImage *img = [UIImage imageNamed:@"about"];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(0, 11.5, 0, 11) resizingMode:UIImageResizingModeTile];
self.resizableImgView.image = img;

请注意,这里 resizingMode
的值设置成 UIImageResizingModeTile
,表示图片的处理方式。由于这里只是水平平铺,所以其 top 和 bottom 都是 0,left 和 right 的值都是根据需要平铺的区域来设定。同样,这也可以通过 Xcode xcassets 的 Slices 来完成。如下图所示:


Xcode 中使用 Slicing 功能平铺处理图片

Xcode 中使用 Slicing 功能平铺处理图片

从上述可以看出,善于 Xcode 可以减少代码量,以更快完成开发任务。

启动图设置

如果你认为启动图同屏幕适配没有半毛钱关系,那就错了,例如,如果你把 Launch Screen File 处清空,使用iPhone5s模拟器启动运行程序,你会看到下图:


红线框处是项目的设置,右边是 iPhone5s 的运行结果,屏幕上下都留有黑条,这是因为没有设置对应的启动图所致,只要在 Assets.xcassets 的 LaunchImage 处添加对应的启动图就可以了。
不过,现在 Xcode7 新建项目时,项目中就自动创建了 LaunchScreen.storyboard 的启动画面文件了,不过若要适配 iOS7.1 及 iOS7.1 以下的低版本,还是需要设置启动图片的。

上一篇 下一篇

猜你喜欢

热点阅读