导读:标注图是客户端进入企业级开发阶段后必不可少的一部分,好的标注图直接影响到客户端最后的还原与实现。随着iPhone的机型越来越多,不同机型上的屏幕大小还不一样,设计师在标注的过程中遇到了很多问题,我作为开发,在和设计师深入探讨后,最后和设计师达成了一个标注方案。这个方案没有什么新奇的地方,但很好的解决了我们碰到的问题。这篇文章会围绕标注过程中产生的问题,深入研究,详细解答,帮路人解惑。由于本人才疏学浅,如有大神路过,定要拍砖指正。
问题的由来
在泡沫上的iOS开发
08年的7月11号,当苹果发布iPhone3G并推出AppStore和iOS开发SDK之后,iOS开发正式出现了。随着iPhone的热卖,App作为移动互联网的入口凸现了它的巨大价值,无数创业团队开始纷纷开发自己的App,iOS开发的身价也是水涨船高。由于苹果提供了完善的开发工具和健全的App市场,App的设计与开发只能按照苹果的标准来,所以320X480
的尺寸成了设计师们设计App的标准尺寸。
这个标准到2012年发布iPhone5之前一直是金科玉律,设计师无须关心什么是px(pixel),什么是pt(point),原因是早期的iPhone中,像素和点是对等的;后来虽然有点小插曲出了retina屏幕,设计师设计时也只需要把原来的尺寸放大一倍即可,开发人员会默认缩小一倍做开发。可以说苹果当时是非常照顾开发和设计人员的,即使升级了retina屏幕,开发和设计之间的默契马上会自动达成。但这也给之后埋下了隐患。
泡沫之后一地鸡毛
iPhone4s是乔布斯的遗作,但它也可以看作是小团队开发iOS应用浪潮中泡沫的分水岭。
之后问题开始慢慢暴露了。首先是iPhone5变长了,当时我们都挺惊讶的,连忙去确认了尺寸,发现屏幕从{320,480}变成了{320,568}。有经验的iOS开发通过动态计算屏幕高度马上解决了这个问题。然后,开发同学和设计同学沟通好,把效果图和标注图的尺寸改成了{640,1136}。这次苹果的改动其实并没有影响原来开发的方式和设计的原则,所以可是说是虚惊一场。
但是好景不长,iPhone6和iPhone6 Plus出现了,苹果第一次在一场发布会上发布2款不同尺寸的手机。这时候,iOS攻城狮心中是一群草泥马在万马奔腾。从那时起,开发和设计之间的问题就彻底暴露了。
当然,苹果也给了一个万金油的方案,如果我们什么都不改,App会在iPhone6和iPhone6 Plus等大屏手机上自动等比放大展示。作为企业级的App,怎么能容忍放大版的App在iPhone6 Plus上显示呢(因为它真的很大)。然后,我们给不同尺寸的机型补上了不一样的启动图(示意图如下)。
ImageSet中的启动图
验证完所有需要支持的iPhone机型,我们得到了4种不同的屏幕尺寸,分别是{320,480},{320,568},{375,667},{414,736}(示意图如下)。
屏幕尺寸比对图
这次苹果给工程师和设计师真的是留了一地鸡毛。
标注单位px和pt之争
开发之殇和设计之痛
开发同学一看到需要给App开发4种尺寸时,一开始的心态是闷逼的。设计人员也纳闷到底拿哪个尺寸做效果图呢。因为都没有经验,一开始我们继续让设计师用{640,1136}做标注图,这样我们结合屏幕的宽度和高度,可以很快的调整好不同尺寸下的布局。
随着iPhone6和iPhone6 Plus的大量普及以及高端Android手机市场份额的提升,之前{640,1136}做的效果图在真机上展示很不理想,于是设计师们把效果图的设计尺寸改成了{750,1334},而且还考虑用{1080,1920}做效果图。一般设计师们都是在效果图上直接做标注,由于效果图尺寸变成了{750,1334},我们iOS开发拿到标注图的尺寸也变成了{750,1334}。然后,开发拿着px做各种换算,碰到了各种奇怪的问题,做出来的页面和效果图的差距总是很大。我列举下几个常见的问题:
- 文本高度总是算不对,导致布局总是不精确
- 设计师看到大屏幕上的字体特别小,而小屏幕上的字体刚刚好,于是要求开发把大屏幕的字体放大1号,然后经常出现大屏手机的文字显示不全的情况。
- 开发为了能适配小屏幕,根据宽度算了一个比例系数,实现页面时所有标注图上定长高的值都乘以该系数来等比缩放,后来发现小屏幕的效果就是不对。
其实,当设计师用小屏幕的规范去设计大屏幕时,设计稿已经出问题了。比如在小屏幕的时候,定义了最小字号为9号,9号字在PS上{750,1334}的设计图起来还可以,但在真机retina屏幕上看起来就很小,视觉落差特别大。设计师一看效果不对,就让开发加大字号;字号变大后,小屏幕的字体就感觉特别大,然后让开发分屏幕对待,小屏幕不变,大屏幕加大字号;开发拿着{750,1334}尺寸的px标注图,总感觉之前除以2后的宽高在小屏幕上显示不对,于是又用(屏幕宽度/320)搞了个比例系数,而且将错就错的在所有的宽高上乘以该系数。
然后在敏捷开发的团队里,设计师和工程师都开始怀疑人生了。设计师总感觉设计稿和真机效果差别很大,工程师总感觉实现的跟标注图不一致。最后只能通过海量的微调来达到看起来差不多的效果。
解铃还须系铃人——深入了解iPhone渲染机制
说到现在,我们差不多明白问题出在哪里了。
首先是设计师的设计规范需要修订了,之前用在小屏幕上的设计规范不能生搬硬套在大屏幕上,需要重新修订设计规范,兼顾小屏和大屏。
然后是工程师需要更加深入的了解iPhone的渲染机制了,否则px和pt会搞得傻傻分不清。有朋友会说,px和pt怎么会搞不清楚呢,1pt在iPhone6(包括iPhone6s)之前都是2px,在iPhone6 Plus和iPhone6s Plus上是3px。但是当你做出来的效果总是跟设计师的标注图不一样时,你是不是会怀疑自己实现错了。当你觉得设计师标注有问题时,你又怎么说明缘由然后告诉设计师一个误差较少的方案呢?你要明白设计师现在以不再是单独为iOS开发做设计了,还要兼顾Android和H5页面。
所以,我们需要静下来好好研究下iPhone现在是怎么渲染的,然后找到一个靠谱的方案让设计师对标注图做调整。
point(pt)和pixel(px)
在iOS开发中,point是抽象单位,它只在iOS系统给我们抽象出来的数字坐标系中有意义,与pixel没有直接的关系。之前我们常说1pt等于2px,1pt等于3px,这些等式之所以成立是因为我们无意识中都给等式加了一个附加条件,那就是在某种机型下。所以之后的机型说不定就有1pt等于4px,1pt等于5px的情况。
当我们在数字坐标系中绘制完界面后,iOS系统就开始在内存中渲染适合当前手机屏幕的页面尺寸,这个时候,渲染的单位就是pixel了。用基于点的图形使用像素进行渲染,这个过程叫做光栅化。像素坐标系是通过点坐标系乘以一个比例因子来获得的。比例因子越大,屏幕的像素密度越大,现实效果就越好。而我们常说的1倍、2倍、3倍就是比例因子。
但是在iPhone6Plus中,屏幕的物理像素只有{1080,1920},而内存渲染的像素却是3倍的点坐标系{1242,2208}。为了正常显示,iPhone6Plus在显示的时候做了一个缩减像素采样(downsampling)的操作。现在我们明白iPhone6Plus的屏幕分辨率为什么不是3倍了。
为了证明iPhone各种机型上渲染的像素是不同的,我们来比较下1个点宽度的线是怎么渲染的。下面是示意图:
iPhone渲染示意图- 早期的iPhone没有retina屏幕,比例因子是1。
- iPhone5是retina屏幕,比例因子是2。
- iPhone6 Plus是高清的视网膜显示屏,比例因子是3;渲染的图片被后期缩放,从2208X1242像素压缩到1920X1080像素。
这个缩放比率是 1920 / 2208 = 1080 / 1242 = 20 / 23。这意味着iPhone原始渲染的过程中,每23个渲染像素必须映射到20个物理像素上。换句话说,图片被缩放到了大约只有原始大小的87%。
下面,我们从宏观的角度来看看不同的iPhone机型是怎么适配的。请看下图:
iPhone适配方案使用pt进行相对布局标注
搞清楚iPhone的渲染机制后,我们也知道了如何让设计师调整标注图了。之前,设计师为了兼顾Android和H5页面的效果图,把效果图大小调整为{750, 1334};考虑到工作量,设计师会在效果图上直接出标注,按照之前的约定默认的单位就px。对于开发人员,拿着{750, 1334}单位是px的标注图,他的第一反应是这是iPhone6的标注,iPhone6 plus和小屏的标注只能自己算了。下面我们拿左边距15px做例子:
各种情况 | 换算的意图 | 换算成pt |
---|---|---|
设计师给的iPhone6标注图 | 直接除以iPhone6的比例因子2 | 7.5pt |
开发换算iPhone6 Plus的标注 | 直接除以iPhone6plus的比例因子3 | 5pt |
开发换算小屏幕iPhone的标注 | 感觉除以比例因子不太对按除以2算 | 7.5pt |
重新换算iPhone6 Plus的标注 | 通过宽度的比例来计算 | 7.5/(375/320)*(414/320) = 8.28 |
这么算下来,感觉pt总是算不对。问题出在不同手机屏幕上相等的视觉长度它们的像素是不同的,所以渲染15px的左边距,不同手机上的视觉边距都不一样。如果想在不同手机屏幕上让左边距看起来都一样,我们必须使用pt为单位,原因我们在上面介绍iPhone渲染机制中已作了说明,这里不再赘述。
其实,设计师关注的点也就是标注的内容在不同手机屏幕上显示的效果一样,比如左边距。对于特殊的适配情况,设计师自然会给不同分辨率下的标注。而之前的原因出在我们开发人员没有向设计师解释清楚不同屏幕上渲染相等的视觉长度,像素是不一样的,但渲染的point是一样的。后来,我们换成了pt作单位,绝大多数实现不准确的问题都被解决了,对于定高定宽的情况,标注时也做了特殊说明,而且也都换成了相对布局的方式进行标注;最后,拿一张我们最近的标注图做示例。
标注示例图总结
终于写完了,感觉自己文笔有限,语句多不通顺,但你要明白一点,不同手机屏幕上渲染相等的视觉长度,pixel是不一样的,但渲染的point是一样的。希望这篇iOS标注解惑能让你了解pixel和point本质的区别。最后欢迎大家积极回复留言,交流心得。
网友评论