iPhone4采用了一个叫做retina的屏幕,尺寸和老的iphone一样大,但是分辨率提高了4倍,看起高清的图来,爽太多了,根本看不到像素点.

对于老的app来说,在iphone4中运行,会自动用4个像素替代原来的一个像素,这样就不用更改代码,使得老app可以自然的在iphone4中运行,但是UI的效果会有些蒙蒙的,不是最佳的效果,要达到最佳,必须为原来的图片资源,重新设计一份640*960的高清版本,这样才能在iphone4内达到最佳的UI效果~

下面就来简单总结下在ios4中怎么样使用高清图,首先要了解一些概念:

Points Versus Pixels:
When using native drawing technologies such as Quartz, UIKit, and Core Animation, you specify coordinate values using a logical coordinate space, which measures distances in points. This logical coordinate system is decoupled from the device coordinate space used by the system frameworks to manage the pixels on the screen.

一般程序中使用到的尺寸都是以point来计算的.

在老的iphone中,point和pixel基本没怎么去分辨,因为都是1:1的,都是320*480.

但是在iphone4或以后的设备中,这个不再是1:1的关系,对于iphone4的retina屏幕来说,1point=2pixels,屏幕的最大point的size仍是320*480.

接下来就说下怎么样使用高清图:
假设现在有两附图Default.png(320*480)和Default@2x.png(640*960)

UIImage *p_w_picpath1 = [UIImage p_w_picpathNamed:@"Default.png"];
UIImage *p_w_picpath2 = [UIImage p_w_picpathNamed:@"Default"];

上面两行代码,在ios4中,都会自动根据你的手机分辨率,来自动匹配图片:

如果是iphone 3G和3GS,调用上面的结果,p_w_picpath1和p_w_picpath2得到的都是Default.png(320*480)这张图片,在查看p_w_picpath的size,你会发现是320*480的(按point来计),再看p_w_picpath的scale这个property是1.0,表示实际的1个piont对应了一个像素点,所以图片的实际像素是(320*scale)*(480*scale)=320*480.

如果是iphone4,返回的结果两个p_w_picpath都是Default@2x.png(640*960)这张图,再次查看p_w_picpath的size,你会发现仍然是320*480(points),但是scale是2.0,表示1个point对应图片上面的两个像素点,所以图片的实际像素是(320*scale)*(480*scale)=640*960.

所以,只用给同名的高清图加上@2x这个后缀,用UIImage的p_w_picpathNamed这个函数调用图片名(未带@2x的),就会自动帮你调用合适的图片,使用起来很方便.

你也可以使用,UIImage的initWithContentsOfFile:(需要图片的完整路径)函数来load图片,但是这个不会帮你自动区分图片,你需要自己根据手机的分辨率来指定调用Default.png还是Default@2x.png.


可以做如下一些测试,能够加深印象:
准备Default.png(320*480),Default@2x.png(640*960),DefaultCopy.png(320*480)和Default_Copy@2x.png(640*960)四张图,分别用p_w_picpathNamed:和initWithContentsOfFile:来调用(直接调用各个文件名:Default.png,Default@2x.png, DefaultCopy.png, Default_Copy@2x.png),然后分别在iphone 3G和iphone 4上面显示看效果,顺便输出p_w_picpath的size和scale来比较.会对这个问题有更渗入的理解.

举个例子:
上面提到过在iphone4上面用p_w_picpathNamed函数调Default.png,返回的是Default@2x.png(640*960)这张图,看起来就会很清楚.

但是如果调用DefaultCopy.png,因为它找不到DefaultCopy@2x.png这张高清图,只能用原来小size的图,所以返回还是DefaultCopy.png(320*480),size是320*480,但是scale是1.0,实际图像的像素就是(320*scale)*(480*scale)=320*480,显示效果差,因为图片像素只有高清的1/4.

以上都是本人的一些简单的总结,难免会有疏漏不正确,多多包涵.