【iOS】UIScreen && UIDevice學習記錄

UIScreen object contains the bounding rectangle of the device’s entire screen. When setting up your application’s user interface, you should use the properties of this object to get the recommended frame rectangles for your application’s window.

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] view plaincopy
  1. CGRect bound = [[UIScreen mainScreen] bounds];  // 返回的是帶有狀態欄的Rect  
  2. CGRect frame = [[UIScreen mainScreen] applicationFrame];  // 返回的是不帶有狀態欄的Rect  
  3. 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] view plaincopy
  1. // 判斷屏幕類型,普通還是視網膜  
  2.     float scale = [[UIScreen mainScreen] scale];  
  3.     if (scale == 1) {  
  4.         bIsRetina = NO;  
  5.         NSLog(@"普通屏幕");  
  6.     }else if (scale == 2) {  
  7.         bIsRetina = YES;  
  8.         NSLog(@"視網膜屏幕");  
  9.     }else{  
  10.         NSLog(@"unknow screen mode !");  
  11.     }  

對dpi和ppi的理解:

DPI是每英寸的點數,可以簡單理解爲點的密度。

PPI是每英寸的像素數,可以簡單理解爲像素密度。

點和像素有區別嗎?很多時候,一個點 = 一個像素。但是,並不盡然,如iPhone的視網膜屏幕,它一個點包含了四個像素,大大提高了顯示清晰度。

使用UIScreen獲取的bounds和frame,都是點的尺寸,而非像素尺寸。例如,在視網膜屏的iPhone4上,我獲取的applicationFrame大小是320x460,很明顯它代表的是點的數量。假如你要顯示一張圖,如果該圖原大小是100x200,那麼顯示在這樣的屏幕上,它的實際顯示出來的尺寸將只有原來大小的一半,但它的像素數並未改變。更加需要考慮的是,如果你要對這張圖進行縮放,那麼縮放率該按照實際顯示尺寸計算,還是按照實際像素數計算?這一塊很重要,曾走了不少彎路,答案是前者。




顧名思義,我們很容易知道UIDevice的代表了一個設備,爲我們提供設備相關的一些信息,現列舉如下:

[plain] view plaincopy
  1. //設備相關信息的獲取  
  2. NSString *strName = [[UIDevicecurrentDevice] name];  
  3. NSLog(@"設備名稱:%@", strName);  
  4.       
  5. NSString *strId = [[UIDevicecurrentDevice] uniqueIdentifier];  
  6. NSLog(@"設備唯一標識:%@", strId);  
  7.       
  8. NSString *strSysName = [[UIDevicecurrentDevice] systemName];  
  9. NSLog(@"系統名稱:%@", strSysName);  
  10.       
  11. NSString *strSysVersion = [[UIDevicecurrentDevice] systemVersion];  
  12. NSLog(@"系統版本號:%@", strSysVersion);  
  13.       
  14. NSString *strModel = [[UIDevicecurrentDevice] model];  
  15. NSLog(@"設備模式:%@", strModel);  
  16.       
  17. NSString *strLocModel = [[UIDevicecurrentDevice] localizedModel];  
  18. NSLog(@"本地設備模式:%@", strLocModel);  
  19.       
  20. float version = [[[UIDevicecurrentDevice] systemVersion]floatValue];  
  21. NSLog(@"版本號:%f\n", version);  
以下是在我的iPhone4上取得的結果:


以下是我在iPad模擬器上取得的結果:


判斷設備型號:

[plain] view plaincopy
  1. -(NSString*)deviceString  
  2. {  
  3.     // 需要 #import "sys/utsname.h"  
  4.     struct utsname systemInfo;  
  5.     uname(&systemInfo);  
  6.     NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];  
  7.       
  8.     if ([deviceString isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";  
  9.     if ([deviceString isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";  
  10.     if ([deviceString isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";  
  11.     if ([deviceString isEqualToString:@"iPhone3,1"])    return @"iPhone 4";  
  12.     if ([deviceString isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";  
  13.     if ([deviceString isEqualToString:@"iPhone5,2"])    return @"iPhone 5";  
  14.     if ([deviceString isEqualToString:@"iPhone3,2"])    return @"Verizon iPhone 4";  
  15.     if ([deviceString isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";  
  16.     if ([deviceString isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";  
  17.     if ([deviceString isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";  
  18.     if ([deviceString isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";  
  19.     if ([deviceString isEqualToString:@"iPad1,1"])      return @"iPad";  
  20.     if ([deviceString isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";  
  21.     if ([deviceString isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";  
  22.     if ([deviceString isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";  
  23.     if ([deviceString isEqualToString:@"i386"])         return @"Simulator";  
  24.     if ([deviceString isEqualToString:@"x86_64"])       return @"Simulator";  
  25.     NSLog(@"NOTE: Unknown device type: %@", deviceString);  
  26.     return deviceString;  
  27. }  

根據設備模式,判斷設備類型(例如,是iPhone或是iPad)

[plain] view plaincopy
  1. -(Boolean)checkDevice:(NSString*)name  
  2. {  
  3.     NSString* deviceType = [UIDevice currentDevice].model;  
  4.     NSRange range = [deviceType rangeOfString:name];  
  5.     return range.location != NSNotFound;  
  6. }  
[plain] view plaincopy
  1. NSString * checkStr = @"iPhone";// 改爲iPadze判斷是否iPad  
  2. Boolean bcheck =[self  checkDevice:checkStr];// 返回爲YES表示是iPhone  

發佈了14 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章