这次苹果一口气出了三款新设备,又要迎来了一波适配,首先来看下设备的相关参数:
型号 | 屏幕尺寸(inch)屏幕对角线(屏幕以外的边宽度不算)1 inch = 2.54cm = 25.4mm | 逻辑分辨率(point)(pt)ios开发单位,即point,绝对长度,1pt=1/72英寸。 | 逻辑分辨率 宽高比 |
亲测用模拟器测的UIScreen的scale与nativeScale与缩放因子相等 | 缩放因子(scale factor) | point = x*x pixel | dpr(设备像素比,1px = (dpr)^2 * 1dp;设备像素比与ppi相关,一般是ppi/160的整数倍) | 物理分辨率(像素)(pixel)(px) | 渲染分辨率 | 像素密度沿着对角线,每英寸所拥有的像素数目(PPI) | ||
iPhone3GS | 3.5 | 320 * 480 | 1.50 | @1x | 1point = 1pixel | 1.0 | 320 * 480 | 163 | ||||
iPhone4/4s | 3.5 | 320 * 480 | 1.50 | @2x | 1point = 2*2pixel | 2.0 | 2倍屏/Retina屏 | 640 * 960 | 326 | |||
iPhone5/5s | 4 | 320 * 568 | 1.78 | @2x | 1point = 2*2pixel | 2.0 | 640 * 1136 | 326 | ||||
iPhone6/6s | 4.7 | 375 * 667 | 1.78 | @2x | 1point = 2*2pixel | 2.0 | 750 * 1334 | 326 | ||||
iPhone6Plus/6s Plus | 5.5 | 414 * 736 | 1.78 | @3x | 1point = 3*3pixel | 2.5 | 3倍屏/RetinaHD屏 | 1242 * 2208 | 401 | |||
Iphone X | 5.8 | 四者是圆角所以对角线比左侧值稍小些 | 375 * 812 | 2.17 | @3x | 6.50 | 1point = 6.5*6.5pixel | 2.9 | 2436 * 1125 | 458 | ||
iphone XS | 5.8 | 375 * 812 | 2.17 | @3x | 6.50 | 1point = 6.5*6.5pixel | 2.9 | 2436 * 1125 | 458 | |||
iphone XR | 6.1 | 414 * 896 | 2.16 | @2x | 4.33 | 1point = 4.33*4.33pixel | 2.0 | 1792 * 828 | 326 | |||
iphone XS MAX | 6.5 | 414 * 896 | 2.16 | @3x | 6.49 | 1point = 6.49*6.49pixel | 2.9 | 2688 * 1242 | 458 | |||
决定屏幕清晰度的值-像素密度 | ||||||||||||
先分析下数据:如果做适配,我们主要关注IphoneX以后出的设备的逻辑分辨率可以看出,X与XS的逻辑分辨率一致,而XR与MAX是逻辑分辨率一致;我们再来看,X与XS的高宽比812 / 375 = 2.17,以及XR及MAX的高宽比896 / 414 = 2.18。而我们的工程之前肯定都适配过X了,所以,适配XR与MAX就so easy了,而且这四种设备都是只支持面容ID而不支持TOUchID的,只要把IphoneX的宏定义对IphoneX的判断或上XR与MAX就行了。以前我们工程里的宏定义如下:
#define IS_IPHONEX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
只要改成:
#define IS_IPHONEX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? ((CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size))||(SCREEN_WIDTH == 414 && SCREEN_HEIGHT == 896)) : NO)
即可。
如果你的项目刚创建不就很easy的情况,强烈建议对整个工程的baseVC做处理,即:在baseVC的View上添加一个UIScrollView,在此SCRollVIew上再添加一个view做所有子控制器的父view,这样,即使以后出现其他宽高比的设备,就不用单独做适配了。
还是如果你的项目刚创建不就很easy的情况,建议对cgrectMake结构体做文章,让你的控件的宽和高按你基准设计图和屏幕的宽高比去变化,这也算是一劳永逸的操作。