基于IOS SDK 4.0及之后版本的应用程序须要可以在不一样分辨率的设备下运行。IOS以一种简单的方式能够支持多分辨率屏幕的状况。大部分处理不一样类型屏幕的工做已经由系统框架处理。但应用程序自己也须要作些工做来修正位图图片,若是应用自己要利用像素,也须要作额外的工做。
支持高分辨率显示屏的清单
为了适应具备高分辨率显示屏的设备,须要作以下几项:
- 在应用程序包中,为每一个图片资源提供高分辨的图片
- 为应用和文档图标提供高分辨率的图片
- 基于矢量的图形和内容,要如之前同样继续使用Core Graphics和UIKit的drawing代码
- 直接使用Core Animation图层时,在绘画以前可能须要调整比例系数(scale factor)
- 使用OpenGL ES进行绘画,要判断是否须要加入高分辨率绘画支持,要合理的设置图层的比例系数
- 对于建立的自定义图片,须要更新建立图片的代码,要考虑比例系数的影响
- 若是应用中直接提供了Core Animation图层的内容,要按须要调整代码
无偿获得的绘画优化
IOS中的绘画技术提供了强大的支持,帮助开发者以最佳的方式渲染绘画内容,而无论当前显示屏所处的是何种分辨率。
- 标准的UIKit views(text views , buttons , table views , 等等)在任何分辨率下会保证正确的渲染
- 基于矢量的内容(UIBezierPath , CGPathRef,PDF)自动充分利用任何额外的像素点来修复图形线条的锯齿。
- 文本(Text)在高分辨率下自动补齐锯齿。
- UIKit支持自动加载为高分辨率准备的图片(@2x)
现存的绘画代码之因此能以正常的方式工做,是由于本地的绘画技术,如Core Graphics已近考虑了当前的比例系数。例如,若是view实现的
drawRect:方法,UIKit自动将当前屏幕的比例系数值设置到view中。此外,在绘画过程当中,UIKit自动修正任何绘画环境使用的当前旋转矩阵(current tansformation matrix CTM),考虑view的比例系数。以后利用
drawRect方法生成的内容会在当前设备屏幕下以合适的比例进行缩放。
若是应用程序只使用本地的绘画技术来渲染其内容,惟一要作的是为使用的图片提供高分辨率的版本。只使用系统的view或只依赖矢量内容的应用能够不用作任何修改。可是使用了图片的应用程序在高分辨率显示屏下,须要提供这些图片的新版本。尤为注意的是,要将图片放大两倍,在水平和竖直方向上提供两倍于原来数量的像素,总的来讲是要提供四倍的像素。
更新图片资源文件
运行在IOS4的应用程序如今要为每张图片提供两个单独的文件。一个用于标准分辨率下,另外一个用于高分辨率。每组图片的命名约定以下:
- 标准版: <ImageName><device_modifier>.<filename_extension>
- 高分辨率版: <ImageName>@2x<device_modifier>.<filename_extension>
<ImageName>和<filename_extension>部分指定了文件的普通名称和扩展名。<device_modifier>部分是可选的,能够在字符串~ipad和~iphone两者中选一。这两个标识符能够为iPad和iPhone同一个文件的不一样版本。新增的@2x标识符代表图片应用于高分辨率,系统知道该图片是标准图片在高分辨率下的变体。
须要注意,建立高分辨率版本的图片须要与原始版本的图片放在application包下的同一位置。
加载图片到应用程序中
UIImage类处理了全部须要加载高分辨率图片到应用中的工做。当建立一个新的image对象后,只要以一样的名称来同时请求图片的标准版和高分辨率版便可。例如,若是有两张图片文件,名为Button.png和Button@2x.png,只要用如下代码请求图片便可:
UIImage* anImage = [UIImage imageNamed:@"Button"];
注意,在IOS4及之后的版本,能够省略文件扩展名而只提供图片名称便可。
在高分辨率显示屏下,
imageNamed:, imageWithContentsOfFile:, 和initWithContentsOfFile: 方法自动查找具备@2x名称的图片。若是找到,则会加载该图片。若是没有提供给定图片的高分辨率版本,image对象仍会加载标准版的图片资源,并在绘画过程当中将其缩放。
注意,若是使用Core Graphics建立图片,谨记Quartz图片并无一个显示的比例系数,它们的比例系数会假定为1.0.若是从
CGImageRef数据类型中建立UIImage对象,须要使用
initWithCGImage:scale:orientation:方法来执行该建立操做。该方法容许添加一个指定的比例系数到Quartz图像数据中。
UIImage对象在绘画过程当中会自动考虑自身的比例系数。这样,只要在程序中提供正确的图片资源,任何渲染image的代码都会正常工做。
使用Image View展现图片
程序中使用UIImageView对象来展现图片,全部添加到该view的图片必须使用相同的比例系数。可使用一个image view来展现单张图片,或者以动画的方式展现多张图片,而且也能够提供一张加亮图片(highlight image)。所以,若是为这些图片中的一张提供了高分辨率版本,那么其它的图片也必须提供相应的高分辨率图片。
更新应用程序图标(Application Icons)和加载图片(Lauch Images)
除了要更新应用程序中的自定义图片资源,同时也要为应用程序的图标和加载图片提供新的高分辨率版本。更新这些图片资源的过程与更新其它图片资源的处理过程是同样的。新建新版本的图片资源添加@2x标识符到图片文件名中,就像处理其它图片同样。例如,对于应用程序图标,要添加高分辨率的图片名到Info.plist文件
CFBundleIconFiles key中。
更新自定义的绘画代码
在应用程序中添加任何的自定义绘画代码,多数状况下是不用考虑当前设备的分辨率。本地的绘画技术会自动保证你在逻辑坐标空间下的坐标系正确映射到当前设备的像素点上。然而有时,也须要了解当前的比例系数以便正确渲染内容。在这些状况下,UIKit,Core Animation以及其它的系统框架会帮助进行正确的绘画。
以编程方式建立高分辨率位图图片
使用
UIGraphicsBeginImageContext函数建立位图时,须要调整代码以考虑比例系数。
UIGraphicsBeginImageContext函数一直以1.0的比例系数建立图片。若是当前设备的显示屏是高分辨率的,经过该方法建立的图片在渲染时可能会显得模糊。要建立比例系数为其它值的图片,须要使用
UIGraphicsBeginImageContextWithOptions。该函数的处理与UIGraphicsBeginImageContext函数的处理过程同样。
- 调用UIGraphicsBeginImageContextWithOptions建立位图绘画环境(要添加合适的比例系数),将其push到图形栈中
- 使用UIKit或Core Graphics经常使用函数来添加图片内容
- 调用UIGraphicsGetImageFromCurrentImageContext 函数来获取位图内容
- 调用UIGraphicsEndImageContext 函数 将当前绘画环境pop出绘画栈
例如,如下代码建立一张200*200像素的位图。(像素点的数量由图片大小乘以比例系数决定)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);
注意,若是位图想要在当前设备下的main screen中以合适的比例系数缩放,在调用
UIGraphicsBeginImageContextWithOptions函数只要将scale参数设置为0.0便可。
调整本地内容适配高分辨率显示屏
若是想要在高分辨率下绘画不一样的内容,须要使用当前的比例系数来修正绘画代码。例如,假设有一个view画1像素的边框线。在比例系数为2.0的设备上,使用
UIBezierPath对象以1.0的宽度画该线条,将会生成2像素宽的线条。在这种状况下,当前线条须要除以当前的比例系数来获得1像素的宽度。
固然,基于比例系数改变绘画参数可能致使未知结果。1像素宽的线条在某些设备上看起来是正常的,可是在高分辨率的设备上看上去会比较细以致于看起来不清晰。这须要根据具体状况决定是否要作变更。
Core Animation Layers中的比例系数的解释
直接使用Core Animation layers提供内容的应用程序,须要调整代码并考虑比例系数的影响。一般状况下,在利用view的
drawRect:方法,或使用layer代理的
drawLayer:inContext:方法时,系统会自动考虑比例系数的影响并调整绘画环境。可是在view执行如下几种操做时,仍是有必要去了解或如何改变比例系数:
- 建立额外的Core Animation layers,设置不一样的比例系数并组合到view的内容中去
- 直接设置Core Animation layer的"contents"
Core Animation的集成引擎会查看每一个layer的
contentsScale属性,决定layer的contents在集成的时候是否须要缩放。若是建立没有关联至view的layers,每一个新的layer对象的比例系数初始化为1.0。若是不改变初始的比例系数,接下来直接将这样的layer画到高分辨率的显示屏上去时,layer的contents会自动缩放来弥补因不一样的比例系数所形成的差别。若是不想layer的
contents被缩放,能够设置layer的比例系数为2.0,可是设置完成后的内容若是没有添加至高分辨率的显示屏,那么现存的内容可能会显得比预期的要小。修复该问题,则须要在高分辨率下使用该layer便可。
当直接设置layer的contents时,调整layer的content来适应不一样的比例系数显得尤其重要。Quartz的图片直接在像素级别下工做,并不理会比例系数的设置。所以在建立CGImageRef对象来设置layer的contents以前,须要检测当前的比例系数并合理的调整image的大小。更要指出的是,当加载application bundle中的图片或使用
UIGraphicsBeginImageContextWithOptions函数建立图片时,都要调整图片的比例系数来与layer的比例系数保持一致。没有建立高分辨率的位图,其缩放比例的设置会按照以前说明的那样进行设置。
注:描述于IOS5.1下,省略对OpenGL ES的描述 html
原文:
Supporting High-Resolution Screens