原文摘自: http://www.douban.com/note/77384858/
iPhone OS4.0加入了scale factor,這表示point長度/pixel長度。在解析度為960*640的裝置上,我們知道邏輯座標系還是不變480*320,那麼一個point有兩個pixel長,所以scale=2.0。在解析度為480*320的裝置商,point和pixel長度相同,scale=1.0。為了程式自動適應解析度,程式會自動給UIScreen.scale賦值,[UIScreen mainScreen].scale = 1.0 or 2.0。我們編程,畫圖,視窗,字型等都是向量圖,通過scale能夠讓我們不管解析度,按照邏輯座標480*320來設計介面,效果在所有解析度下都一致(物理尺寸位置一致)。但是和光柵相關的位元影像又如何適應呢?比如一個32*32的圖片,在高解析度下,如果要位置大小都不變,那麼32*32的映像點顯示在64*64的像素(光柵)上。在不改程式的情況下,一個映像點的顏色對應4個顏色一致的像素點。這樣圖片不光模糊,而且還有鋸齒。所以,要需要一個64*64的新圖片代替原圖片。在不改程式碼的情況下如何??SDK要求我們再加一個圖片,比如原圖片是image.png,新加的就是image@2x.png,是64*64的。在系統scale=2.0時,載入映像時先找@2x的,找不到在找原來的,所以就是只要給所有的映像資源檔都加上一個新的高清晰的@2x檔案,程式就自動在高分辨螢幕上用高清晰圖片,低分辨上用低清晰映像。再來看看SDK是如何?的。前提是程式碼沒變,SDK內部實現變了。變了什麼,主要就是UIImage新加了個scale。按前面所講的,讀取image@2x.png時,scale=2.0,讀取image.png時scale=1.0。看同一張圖片,有如下幾個情況:當UIScreen.scale=2.0時,讀取image@2x.png,UIImage.scale=2.0 UIImage.size=16*16當UIScreen.scale=1.0時,讀取image.png, UIImage.scale=1.0 UIImage.size=32*32當UIScreen.scale=2.0時,讀取image.png, UIImage.scale=1.0 UIImage.size=32*32 (不存在@2x檔案的時候)看出來沒有,圖片的實際尺寸是size*scale。這裡就可以給出UIImage的scale含義:sacle = 實際大小 / 當前邏輯大小當前邏輯大小 = 實際大小 / sacle當前邏輯大小 = 實際大小 * (1/sacle)sacle是什麼,是縮小因子。1/sacle才是放大因子。這跟一般情況的scale是放大因子是相反的啊!!!比如UIScreen.scale=2.0,就表示我們的螢幕是被放大2.0倍的。而UIImage.scale=2.0表示什麼,表示當前的圖片是被縮小了2.0倍的。-----------------------------------------------end------------------------------------------------------------------在同一張圖片sacle=2.0和1.0時,UIImageView大小不變時,也就是說,雖然我沒有高清晰圖,但我把原來的圖copy一個為@2x時,效果是不是一樣的呢?發現效果還真是不一樣啊。@1.0是圖片直接放大,有鋸齒的。 @2.0是顯卡放大,無鋸齒了。
代碼:- (void)viewDidLoad { [super viewDidLoad];UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 50.0, 200.0, 32.0)] autorelease];[self.view addSubview:label];label.backgroundColor = [UIColor clearColor];label.text = [NSString stringWithFormat:@"Screen.scale:%.1f", [UIScreen mainScreen].scale];do {UIImage *image = [UIImage imageNamed:@"test.png"];UIImageView *imageView = [UIImageView alloc] initWithImage:image];imageView.frame = CGRectMake(15.0, 100.0, 32.0, 32.0);[self.view addSubview:imageView];[imageView release];UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 100.0, 300.0, 32.0)] autorelease];[self.view addSubview:label];label.backgroundColor = [UIColor clearColor];label.text = [NSString stringWithFormat:@"image.scale:%.1f size:%.0f*%.0f", image.scale, image.size.width, image.size.height];}while (0);do {UIImage *image = [UIImage imageNamed:@"test2.png"];UIImageView *imageView = [UIImageView alloc] initWithImage:image];imageView.frame = CGRectMake(15.0, 150.0, 32.0, 32.0);[self.view addSubview:imageView];[imageView release];UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 150.0, 300.0, 32.0)] autorelease];[self.view addSubview:label];label.backgroundColor = [UIColor clearColor];label.text = [NSString stringWithFormat:@"image.scale:%.1f size:%.0f*%.0f", image.scale, image.size.width, image.size.height];}while (0);}