UIScreen對象包含了整個屏幕的邊界矩形。當構造應用的用戶界面接口時,你應該使用該對象的屬性來獲得推薦的矩形大小,用以構造你的程序窗口。
以下列出的屬性和操作是我用過的。
+ mainScreen Returns the screen object representing the device’s screen.
bounds property Contains the bounding rectangle of the screen, measured in points. (read-only)
applicationFrame property The frame rectangle for the app window. (read-only)
scale property The natural scale factor associated with the screen. (read-only)
[plain]
CGRect bound = [[UIScreen mainScreen] bounds]; // 返回的是帶有狀態欄的Rect
CGRect frame = [[UIScreen mainScreen] applicationFrame]; // 返回的是不帶有狀態欄的Rect
float scale = [[UIScreenmainScreen] scale]; // 得到設備的自然分辨率
對於scale屬性需要做進一步的說明:
以前的iphone 設備屏幕分辨率都是320*480,后來apple 在iPhone 4中采用了名為Retina的顯示技術,iPhone 4采用了960x640像素分辨率的顯示屏幕。由於屏幕大小沒有變,還是3.5英寸,分辨率的提升將iPhone 4的顯示分辨率提升至iPhone 3GS的四倍,每英寸的面積里有326個像素。
scale屬性的值有兩個:
scale = 1; 的時候是代表當前設備是320*480的分辨率(就是iphone4之前的設備)
scale = 2; 的時候是代表分辨率為640*960的分辨率
判斷屏幕類型:
[plain]
// 判斷屏幕類型,普通還是視網膜
float scale = [[UIScreen mainScreen] scale];
if (scale == 1) {
bIsRetina = NO;
NSLog(@"普通屏幕");
}else if (scale == 2) {
bIsRetina = YES;
NSLog(@"視網膜屏幕");
}else{
NSLog(@"unknow screen mode !");
}
對dpi和ppi的理解:
DPI是每英寸的點數,可以簡單理解為點的密度。
PPI是每英寸的像素數,可以簡單理解為像素密度。
點和像素有區別嗎?很多時候,一個點 = 一個像素。但是,並不盡然,如iPhone的視網膜屏幕,它一個點包含了四個像素,大大提高了顯示清晰度。
使用UIScreen獲取的bounds和frame,都是點的尺寸,而非像素尺寸。例如,在視網膜屏的iPhone4上,我獲取的applicationFrame大小是320x460,很明顯它代表的是點的數量。假如你要顯示一張圖,如果該圖原大小是100x200,那么顯示在這樣的屏幕上,它的實際顯示出來的尺寸將只有原來大小的一半,但它的像素數並未改變。更加需要考慮的是,如果你要對這張圖進行縮放,那么縮放率該按照實際顯示尺寸計算,還是按照實際像素數計算?這一塊很重要,曾走了不少彎路,答案是前者。