① iOS 获取屏幕分辨率 以及放大模式、高清模式区别无标题文章
CGRect rect_screen = [[UIScreenmainScreen]bounds];
CGSize size_screen = rect_screen.size;
CGFloat scale_screen = [UIScreenmainScreen].scale;
CGFloat width = size_screen.width*scale_screen;
CGFloat height = size_screen.height*scale_screen;
NSLog(@"width:%f",width);
NSLog(@"height:%f",height);
2015-03-0415:35:06.340reader[10697:179349]width:640.000000
2015-03-0415:35:06.341reader[10697:179349]height:1136.000000
上述情况在iphone6和iPhone6 Plus的缩放模式下,和iPhone5S获取到的分辨率是一样的。
别忘记iphone 6 6+有放大模式和,正常模式
#define iPhone5 ([UIScreen
instancesRespondToSelector:@selector(currentMode)] ?
CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen]
currentMode].size) : NO)
//放大版的iphone6等于Iphone5的分辨率《求区别办法》
#define iPhone6 ([UIScreen
instancesRespondToSelector:@selector(currentMode)] ?
(CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen]
currentMode].size) || CGSizeEqualToSize(CGSizeMake(640, 1136),
[[UIScreen mainScreen] currentMode].size)) : NO)
#define iPhone6plus ([UIScreen
instancesRespondToSelector:@selector(currentMode)] ?
(CGSizeEqualToSize(CGSizeMake(1125, 2001), [[UIScreen mainScreen]
currentMode].size) || CGSizeEqualToSize(CGSizeMake(1242, 2208),
[[UIScreen mainScreen] currentMode].size))
: NO)
② 苹果5ppi是多少
苹果iPhone 5,屏幕像素密度是326ppi。
PPI即是Pixels per inch,每英寸所拥有的像素Pixel数目 。
也就是说屏幕的PPI越大,屏幕成像就越清晰细腻。
③ 苹果1手机屏幕像素密度
91ppi。屏幕像素密度,直译过来就是每英寸上显示的像素数量。表示沿着对角线,每英寸所拥有的像素数目。苹果1手机屏幕像素密度是91ppi。iPhone是苹果公司发布搭载iOS操作系统的系列手机。
④ 苹果 iPhone 4的PPI是多少
苹果 iPhone 4屏幕的PPI为:326。
iPhone 4采用了名为Retina的显示技术;
3.5英寸960x640像素分辨率的显示屏幕。
显示屏幕分辨率达到了800:1的高对比度;
同时加入了IPS屏可视角度技术。
⑤ 理解DPI、PPI和逻辑分辨率,你需要知道这些
在Google上搜索”DPI vs PPI”可以看到非常多的关于这两个概念的讨论,而且讨论内容不仅仅是界面设计、软件开发的内容,也包含印刷、图像处理和其他内容。那么DPI到底是什么,和PPI又有什么区别呢?这篇文章,就让我来带你一探究竟。
DPI :Dots Per Inch。每英寸点数。
上面这个定义非常简洁,但是重点没说清楚:“点”/Dot是什么?这就是理解DPI的关键。
DPI最初用于图像的印刷。图像如果要打印到纸上,实际上是通过一系列的墨点来绘制的,在“打印”这个场景中,墨点,就是DPI中D的概念。DPI的含义是点密度,用来描述打印的精细程度。
举个例子:目前常见的打印机, DPI是300。也就是说打印机能够在每英寸长度的纸上面,打印300个独立的墨点。 这就是说,如果我们打印一个边长为1英寸的黑色正方形,那么打印机会在这个正方形的范围内,绘制300 × 300 = 90000个墨点。
这便是DPI在印刷领域的定义。事实上DPI这个词最早就由印刷行业创建[1]。单色印刷通过控制墨点的密度,来区分不同的灰度,墨点的密度,就称作DPI。
最初的打印机是点阵式打印机(Dot Matrix Printer)[2],原理是使用撞针撞击墨带,墨带和纸接触将墨印到纸上。一根撞针将颜色印到纸上,就形成一个“点”。因为撞针的物理特性。不能做得很小,这类打印机的DPI很低,在70左右。
随后喷墨打印机(Inkjet Printer)[3]的出现,让DPI提高了非常多,甚至可以支持打印灰度、颜色。最常见的喷墨式打印机,常用DPI为300。有些打印机可以达到1200。过高的DPI对纸张也有了更高的要求。通常我们都在使用300DPI作为打印参数。
PPI是数字显示时代的参数,PPI是Pixel Per Inch的缩写,也就是每英寸像素。这个指标用于表示屏幕的物理精细度。
最早的支持GUI的电脑屏幕,比如施乐的Alto,苹果的Macintosh,屏幕的像素密度都是72PPI[4],这个值,就来自于当时的点阵式打印机的精度。因为PPI相同,所以屏幕上显示的一个像素,就对应打印出的纸上面的一个点,相同尺寸(5点)的文字,可以在显示器上得到所见即所得的效果。(当时,纸质文件是主要的信息交换方式)
在这个年代,DPI和PPI的含义是一样的,因为显示器上,图像的组成最小单位,就是屏幕上的一个物理像素。如果一张图片的尺寸为72×72,那么在屏幕上显示为1英寸,打印出来也是1英寸。
如今,在显示领域DPI区别于PPI,要”归功“于微软当时的一个决策。因为眼睛和屏幕的距离,通常大于看纸张的距离(大约长30%)。所以虽然DPI和PPI一致能保证在屏幕上所见即所得,但直接观感上,屏幕上的内容相对于纸上会更小。
微软为了解决这个问题,在操作系统层面做了一个HACK:假定屏幕的PPI是96(因为当时大多数显示器都是72PPI,96 = 72 × 4/3)。所以运行在微软操作系统上的软件都认为这块显示器的PPI是96,以至于同样是10点(point)大小的文字,在实际上是72PPI的显示器上,最终实际看起来就会(相比于软件认为是72PPI,10像素)大1/3(13像素,实际用来显示文字的像素数变多了)。[5]
短期来看微软解决了”保护视力“的问题,但正是因为微软的这一决策,让DPI和PPI的概念开始如此难以理解。
同时,也说明了DPI和PPI的一个最重要的区别:
DPI的差异会影响使用密度无关单位(比如:点,point)设置尺寸的图像的显示。DPI > PPI,导致占用更多像素,整个屏幕显示更少内容,反之亦然。
显示技术发展到现在,尤其2010年iPhone 4发布之后,PPI成为显示产品的一个重要竞争参数。高PPI可以带来更多的显示空间,也可以用来提升图像的显示效果。
从最初的72PPI/96PPI开始,后面几十年的发展,桌面显示器的PPI都提高到了110左右,相比于之前,增大的PPI带来的主要收益是显示空间的增大。举个例子:同样是17寸的显示器,1280 × 960分辨率相比于1024 × 768增加了像素数,同样也增大了PPI。因为都是17寸,虽然显示器的显示面积没有变大,但是像素数的增加使得屏幕可以显示更多内容,但是因为物理尺寸不变,界面元素就变小了。
在低PPI时代,操作系统默认会选择更大显示空间。长时间以来消费者已经习惯了低PPI的显示效果,厂商也不愿意创新,年复一年贩卖着低PPI的屏幕。
直到iPhone 4带着视网膜屏幕出现,才真正意义的让消费者感受到了高PPI带来的显示效果的提升。iOS的做法,是直接将PPI翻倍,使用4个像素来渲染原本仅用一个像素渲染的内容。对于文字来说,得益于矢量字体,文字的显示效果变得异常清晰,对于位图来说,高PPI的屏幕,也使得高质量的位图能够被显示。
事实证明,高PPI屏幕带来的显示效果提升是巨大的。高PPI移动设备的兴起,尤其是2013年MacBook Pro with Retina Display的发布,倒逼着桌面电脑厂商和显示器厂商生产更高PPI的屏幕。苹果使用移动、桌面两个平台的优秀体验,刷新了消费者对于显示的认知。不过,高PPI并不是一上来就完美。iOS和macOS视网膜屏幕推出之后很长时间,有很多应用仍然没有适配视网膜屏幕,也就是没有发挥高PPI的优势。
iOS和macOS对于没有适配的应用,在系统层面做了自动适配处理,就是对应用 使用低PPI进行离屏渲染 ,然后将渲染结果 拉伸到高PPI 。这样的结果是:
以下是适配视网膜屏幕之前、之后的Chrome的显示差异[6]:
和苹果的境遇不同,兼容机厂商无法控制操作系统,微软无法控制硬件。所以Windows对高PPI屏幕的支持要逊色一筹。以至于直到Windows 8.1发布,才可以实现在高PPI设备上充分利用高PPI的优势,显示更精细的图像,同时还能保证旧应用功能可用(并不是所有应用)。[7]
现在,不管是macOS还是Windows 10,都能充分利用高PPI显示更精细的图像,并且默认,macOS和Windows都将内容放大,使用更多像素渲染更少内容,也即选择了“更精细的图像”。其实,视网膜屏幕的效果,是在足够高的PPI下,实现了不减少显示空间的前提下,将显示精度提高了一倍。
目前的操作系统:Windows、macOS、iOS、Android等,都提供了或者部分支持修改DPI的选项,让用户选择更多显示空间,或者更精细的图像。因为物理参数已经固定了,所以更多显示空间就意味着元素相对更小,更精细的图像就意味着元素相对更大。当然,得益于物理参数的提升,相比于非Retina显示设备,均可以达到更高精度,更大空间。
高PPI下,DPI还是那个DPI吗?为了介绍高PPI时代的显示策略,先介绍一个在高PPI下,从DPI衍生出的一个更容易理解的参数: scaling factor,缩放因子 。
为了方便说明,我们要对显示过程进行抽象。抽象出两个过程:渲染、输出;和三层抽象屏幕:逻辑层、渲染层、物理层。开发软件时,是在逻辑层上使用 逻辑像素 设置元素的长度。操作系统首先将逻辑层上的图像 渲染 到渲染层,得到 渲染分辨率 的图像;再将渲染层的图像, 输出 到物理层,也就是物理显示设备上。
高PPI下, DPI实际指的是渲染层的渲染像素密度 。如果渲染像素密度和物理像素密度恰好相等,那么 DPI == PPI 。不过,即便数值相等,含义还是不同的。下面通过在macOS,iOS,Android设备上的例子,来帮助理解这些概念,以及这些概念在操作系统实际显示过程中的相互作用。
设备:MacBook Pro 2017
物理分辨率:2880 × 1800
屏幕尺寸:15.6英寸
macOS支持用户设置逻辑分辨率:
macOS系统在渲染时, 缩放因子固定为2 。以下示例中,为了获得渲染层的图像,可以简单通过全屏截图获得。
这个设置是MacBook Pro 2016以前的默认设置。
此时,DPI == PPI。
这个设置是MacBook Pro 2016及以后的默认设置。
为了得到更大的显示面积,设置了更大的逻辑分辨率,因为缩放因子不变,渲染层渲染了超过物理分辨率的图像,DPI大于PPI(屏幕尺寸不变,分辨率增大)。虽然和Window早起的处理一样,增大了DPI,但因为这里并不是像Windows一样将渲染像素点对点显示到物理屏幕上,所以实际的效果是界面元素变小,使得显示空间变大。
因为物理分辨率(2880 × 1800)仍然大于逻辑分辨率(1680 × 1050),所以并没有丢失逻辑层的信息。
仅部分iOS设备支持修改逻辑分辨率,分别是4.7英寸、5.5英寸iPhone,iPhone Xr和iPhone Xs Max。并且仅支持将逻辑分辨率修改为逻辑分辨率更低的一档。比如5.5英寸的iPhone,可以将逻辑分辨率修改为4.7英寸iPhone的逻辑分辨率。和macOS一样,为了获得渲染层的图像,可以简单通过全屏截图获得。
设备参数:缩放因子 = 3,物理分辨率 = 1080 × 1920,PPI = 401。
类似macOS的示例2,虽然最终显示有缩小,但实际上没有丢失逻辑层的信息。DPI为461。
设备参数:缩放因子 = 3,物理分辨率 = 1080 × 1920,PPI = 401。
类似macOS的示例2,虽然最终显示有缩小,但实际上没有丢失逻辑层的信息。DPI为417,相比上面的示例1,逻辑分辨率减少,显示内容变少,渲染分辨率变小,界面元素变大。可以看到macOS和iOS都是通过修改逻辑分辨率达到修改DPI,修改显示策略的目的。
设备参数:缩放因子 = 3,物理分辨率 = 1242 × 2688,PPI = 458。
iPhone XS Max因为物理像素密度增大到458,屏幕像素数量增加,所以能实现在缩放因子为3时,渲染分辨率和物理分辨率点对点显示。实际上iPhone XS Max的 逻辑分辨率宽度 ,和5.5英寸iPhone的 逻辑分辨率宽度 一致,这也是 iPhone XS Max和5.5英寸iPhone 在横向上能显示相同数量内容的原因。
Android的情况就比较特殊了。Google和Windows的境遇比较相似,作为软件提供商,他们的操作系统会运行在不同的设备上,要应对不同PPI的屏幕。好在Android在设计之初就已经为不同PPI的屏幕适配设计了API,所以不会有早期Windows那样糟糕的兼容问题,但也带来了更高的复杂度。
Android和macOS、iOS固定缩放因子 + 指定逻辑分辨率不同。Android直接提供修改DPI的方法,厂商可以在构建操作系统固件时,指定DPI。DPI、缩放因子、逻辑分辨率的关系如下:
Android同样提供缩放因子这个参数,同样,我们依然使用上面介绍的三层抽象模型进行分析。DPI参数,使用 resources.displayMetrics.densityDpi 获取。
设备参数:物理分辨率 = 1080 × 1920,PPI = 403,DPI = 440。
计算参数:缩放因子 = 440 / 160 = 2.75。
可以看到,默认参数下,小米9的渲染分辨率和物理分辨率一致。那么修改了DPI会怎样呢?Android从7.0版本[8]开始在开发者选项中提供了名为” 最小宽度 “的修改项(最小宽度是逻辑分辨率的一部分,短边分辨率)。这个修改项的数值,就是逻辑分辨率中的短边值。小米9的默认值是392,我们将其改到480看下效果。
设备参数:物理分辨率 = 1080 × 1920,PPI = 403, DPI = 360 。
计算参数:缩放因子 = 360 / 160 = 2.25。
首先我们注意到DPI变成了360,为什么改了最小宽度,DPI的值会变化呢?实际上Android系统提供的修改最小宽度的方法,同样也是通过修改DPI实现的,只不过包装成了”最小宽度“(事实上就是在修改逻辑分辨率),系统在修改的时候换算成DPI,再修改系统参数。
其次我们看到因为Android使用动态的缩放因子,并且物理分辨率用作计算缩放因子的参数,所以反算出来的渲染分辨率,就是物理分辨率。这种做法的好处是 避免了一次内存中的位图缩放操作 。
因为逻辑像素的增加,屏幕可以显示更多内容,同时界面元素变小。
为什么基准DPI的值是160呢?Android并没有官方解释,我猜测有一下几方面原因:
因为Android的渲染策略是通过DPI指定的,所以Android对位图的使用策略,也是通过DPI来确定的。Android将DPI划分为了几个档:
开发者需要提供不同DPI的图片,使用相同的名称,如artboard.png,放到不同的目录下。应用运行时,使用 R.drawable.artboard 引用这张图片。操作系统根据DPI设置选择合适的图片资源进行显示。系统的DPI和哪个档位的DPI值相近,就会使用哪个档位的图片资源。比如:
iOS和Android开发中使用的长度单位,都是密度无关像素,或者称作逻辑像素。逻辑像素和渲染像素之间的转换关系是:
之所以这里在使用渲染像素,而不是物理像素,是为了结论的普适性。对于Android来说:
DP之所以是密度无关像素,就是因为使用DP进行开发,不需要关系DPI,因为在 逻辑层,没有密度的概念 (可以将逻辑层的图像内容,理解为矢量内容)。
看到这里,相信你已经对DPI的来龙去脉都有了比较清晰的了解。我们总结一下:
怎么样,仅DPI这个概念,随着科技发展,特别是消费电子的发展,也发生了非常大的变化。各厂商和操作系统对DPI的使用也不尽相同,从早期微软的虚拟DPI开始,DPI的概念变得越来越难理解。不过,理解DPI不是最终的目的,对于用户来说,了解如何利用DPI调节最适合自己的显示效果;对于开发者来说,了解如何利用DPI构建更精细、协调的界面,才是更有价值的事情。
希望本文能帮助到你。
⑥ iOS、Android 开发单位换算及 UI 切图要求
在移动端 UI 设计中,经常会用到的单位有 4 种:px、pt、dp 和 sp,很多人分辨不清这几种单位及其换算关系,以及 iOS 和 Android 的切图要求,我在这里做下简单的介绍,希望大家读完后能有所收获(如有错误,欢迎纠正)。
px 即 pixel,像素点,电子屏幕上组成图像的最基本单位,在描述屏幕分辨率时也会使用该单位。1px 表示一个像素,例如 iPhone 8 的尺寸为 750px × 1334px,表示在该手机屏幕上,水平方向每行有 750 个像素点,垂直方向每列有 1334 个像素点。
pt 即 point,有两个含义:一是印刷行业常用单位,是一个标准长度单位,绝对大小,1pt = 1/72 英寸 = 0.35mm;二是 iOS 开发用的基本单位,当设计师以 1 倍尺寸进行设计 (375pt × 667pt) 并给出标注稿时,开发人员无需除以 2 便可直接使用。
dp 是安卓开发用的基准单位,在 dpi (屏幕像素密度,即每英寸包含的像素点) 为 160 的屏幕为上,1dp = 1px。为了简单起见,Android 把屏幕密度分为了 5 种:mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi,下文会详细介绍其换算关系。
在安卓系统里,sp 与 dp 类似,不同的是 sp 可以根据用户的字体大小首选项进行缩放,而 dp 则不会。 尽量使用 dp 作为空间大小单位,sp 作为文字相关大小单位,例如:新闻类和短信类等大篇幅文本,推荐使用 sp 为单位。
在 iOS 开发中,不同机型的 iPhone 设备需要用到不同倍率的切图,下表格为各 iPhone 机型显示屏参数对比:
这里再简单了解下两个概念,ppi 和 dpi。
ppi (iOS):即 pixel per inch,屏幕像素密度,表示每英寸所包含的像素点,该值越高,屏幕越细腻。
dpi (iOS) :开发像素密度,表示每英寸所包含的开发像素点。
在 iOS 开发中,规定以 ppi = 163,dpi = 163 作为开发基准,
当 ppi = 163,dpi = 163 时,则 1pt = 1px;
当 ppi = 326,dpi = 163 时,则 1pt = 2px;
当 ppi = 401,dpi = 154 时,则 1pt = 2.6px ≈ 3px。
(为什么 iPhone 8+/7+/6+ 的开发基准是154?可能要问问苹果了...)
依此类推,得出换算公式一:
若有小数,四舍五入即可。
在 iOS 开发中,目前只需要 @2x 和 @3x 两种切图,所以导出 2 倍和 3 倍的 png 图片即可。导出前注意检查切图是否存在半像素、毛边等情况,保证对齐像素,这样才能有效避免上线后页面上的 icon 出现虚边的问题,提高细节质量。
另外补充一点:从整体开发尺寸看,iPhone 8 是 375 × 667 pt (@2x),而 iPhone X 是 375 × 812 pt (@3x),同样的宽度,一个用 @2x 图,一个用 @3x 图,iPhone X 表现出了更高的清晰度,如图 2-1 所示。
在 Android 开发中,因为机型参差不齐,需要用屏幕密度来区分设计。
注意,这里的 dpi (Android) 和上文的 dpi (iOS) 是不同的概念,dpi (iOS) 是开发像素密度,而 dpi (Android) 即 dot per inch,表示屏幕像素密度 ,类似 iOS 开发里的 ppi。
Android 中,规定以 dpi = 160 为开发基准,
当 dpi = 160,基准dpi = 160,1dp = 1px;
当 dpi = 240,基准dpi = 160,1dp = 1.5px;
当 dpi = 320,基准dpi = 160,1dp = 2px。
依此类推,得出换算公式二:
在设计图标时,对于 5 种主流的屏幕像素密度 (mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi) 应按照 2:3:4:6:8 的比例进行缩放,如图 3-1 所示。
例如,一个启动图标的尺寸为 48 × 48 dp,这表示在 mdpi 的屏幕上其实际尺寸应为 48 × 48 px;在 hdpi 的屏幕上其实际大小是 mdpi 的 1.5 倍 (72 × 72 px);在 xhdpi 的屏幕上其实际大小是 mdpi 的 2 倍 (96 × 96 px),依此类推。
在某些况行下,还需要提供一种特殊的切图: 点九图 (上图所示)。点九图是 Android 开发中用到的一种特殊格式的图片,文件名以 “.9.png” 结尾。
这种图片能告诉程序,图像哪一部分可以被拉升,哪一部分不能被拉升需要保持原有比列。运用点九图可以保证图片在不模糊变形的前提下做到自适应,比如对话框背景图片就会用到点九图。
--
以上是全部内容,感谢你的阅读!
End
⑦ iPhone屏幕尺寸和分辨率的相关知识 ( DPI vs PPI pt vs px)
DPI <Dots Per Inch> ---- 最初用于衡量打印物上每英寸的点数密度,就是表示你的打印机可以在一英寸内打印多少个点。DPI值越小,打印的内容越不清晰。
当DPI的概念迁移到计算机屏幕上的时候,就应该称之为PPI <Pixels Per Inch>。同理:PPI就是表示计算机屏幕上每英寸可以显示的像素点的数量。
pt <Point> ---- 代表点,是一个标准的长度单位,定义上:1 pt = 1 / 72 英寸,英寸跟我们所熟悉厘米、米一样,所以我们可以明确的指出1pt的长度是多少。
px <Pixel> ---- 代表像素,是屏幕上能显示的最小单位,在分辨率高的屏幕上,一个像素可能会达到我们肉眼无法识别的大小。
PS: Apple Device Screen Sizes 、 AppStore审核之App预览规范 、 AppStore审核之App截屏规范
视网膜屏幕是在iPhone 4发布时进入大众视野的,叫视网膜是因为屏幕的PPI已达到人们肉眼无法看到的级别,即我们肉眼已无法识别屏幕上的一个像素,从技术上来说就是Apple在物理尺寸与上一代相同的屏幕上塞下了2倍的像素。
iPhone 4采用Retina显示屏,在物理尺寸不变的情况下,像素成倍增加,达到了640x960像素。 iPhone 3GS屏幕上有320 x 480 = 153600个像素点,而iPhone 4屏幕上则有640 x 960 = 614400个像素点,像素个数是原来的4倍。
这样就出现了一个问题,怎么样让原来的App运行在新的手机上面? 为了运行之前的App,Apple引入了一个新的概念:point (点),“点”这个概念在iOS开发中很重要。iPhone 4屏幕尺寸继续保持320x480大小,不过单位并非是像素,而是“点”。
在iPhone 3GS中,一个点等于一个像素,也就是说点与像素可以直接互换;在iPhone 4中,一个点等于两个像素;在iPhone 7 Plus中,一个点等于三个像素。
iPhone 4和iPhone 3GS的屏幕尺寸实际上是一样的,都是3.5英寸。在屏幕上同样一个点,实际尺寸大小一样,只是在iPhone 4上单位英寸内的像素点更多,看起来更加细腻。
iPhone 4/4s iPhone 5/5s iPhone 6/6s的PPI都是一致的,都是326,用@2x素材。
但是iPhone 6 Plus的PPI是401,理论上苹果应该采用401 / 326 * @2x = @2.46x的素材,但是这个奇葩的比例对于开发者而言很难切图,所以Apple为了方便开发者就采用了@3x的素材,然后再缩放到@2.46x的屏幕上,也就是缩放到2.46 / 3 = 82%。实际上Apple选取了一个接近比例的87%,这样算下来,物理分辨率和虚拟分辨率的比例是87%,也就是1080 / 1242 ≈ 0.87, 1920 / 2208 ≈ 0.87。
⑧ 苹果4的像素密度是多少ppi
苹果4的屏幕分辨率是640*960,640:960=1:1.5
勾股定理,对角线应该是 根号(1*1+1.5*1.5)=1.80
而对角线物理长度是3.5英寸,
那么640像素那条边的物理长度应该是 3.5*1/1.80=1.95英寸
那么苹果4的像素密度就是 640像素/1.95英寸=328像素/英寸=328ppi
希望能帮到你
⑨ iOS开发:iPhone尺寸和适配
我们通常所说的iPhone5屏幕尺寸为4英寸、iPhone6屏幕尺寸为4.7英寸,指的是显示屏对角线的长度(diagonal)
PPI(Pixel Per Inch by diagonal):表示沿着对角线,每英寸所拥有的像素(Pixel)数目。
PPI数值越高,代表显示屏能够以越高的密度显示图像,即通常所说的分辨率越高、颗粒感越弱。
根据勾股定理
计算结果稍有出入,这是因为像素的离散采样有锯齿效应。
早期的iPhone3GS的屏幕分辨率是320*480(PPI=163),iOS绘制图形(CGPoint/CGSize/CGRect)均以point为单位(measured in points):
后来在iPhone4中,同样大小(3.5 inch)的屏幕采用了Retina显示技术,横、纵向方向像素密度都被放大到2倍,像素分辨率提高到(320x2)x(480x2)= 960x640(PPI=326), 显像分辨率提升至iPhone3GS的4倍(1个Point被渲染成1个2x2的像素矩阵)。
在同样的逻辑坐标系下(320x480):
为了自动适应分辨率,系统会根据设备实际分辨率,自动给UIScreen.scale赋值,该属性对开发者只读。
在同样的逻辑分辨率下,可以通过scale参数识别是iPhone3GS还是iPhone4(s)。以下基于nativeScale参数,定义了探测机型是否为iPhone6+的宏
--------------------------------------------------------------------------------那么,同样的分辨率和scale,如何区分机型iPhone4与4s、iPhone5与5s呢?通过[[UIDevice currentDevice] model]只能判别iPhone、iPad、iPod大类,要判断iPhone具体机型型号,则需要通过sysctlbyname("hw.machine")获取详细的设备参数信息予以甄别。
iPhone3GS时代,我们为一个应用提供图标(或按钮提供贴图),只需要icon.png。针对现在的iPhone4~6 Retina显示屏,需要制作额外的@2x高分辨率版本。
Phone6+在实际渲染时,downsampling/1.15(1242x2208->1080x1920),准确的讲,应该是@2.46x。苹果为方便开发者用的是@3x的素材,然后再缩放到@2.46x上。
参考: 一张图帮你看懂 iPhone 6 Plus 屏幕分辨率
<1>
该方法使用系统缓存,适合表视图重复加载图像的情形。同时该API根据UIScreen的scale,自动查找包含对应高倍图后缀名(@2x)的文件,如果找到二倍图,则image.scale=2.0,对应逻辑size大小以point度量(pixel度量的一半);如果没找到设置默认image.scale=1.0,对应逻辑size大小同像素尺寸。因此,
<2>
这组方法创建的UIImage对象 没有使用系统缓存 ,并且指定文件名必须包含明确的高倍图后缀。
<3>
//考虑 转屏 的影响,按照实际屏幕方向(UIDevice Orientation)的宽高
//不考虑转屏的影响,只取竖屏(UIDevice OrientationPortrait)的宽高
待续