文章轉自:http://openfibers.github.io/blog/2015/03/10/uiscreen-nativescale-method-handle-standard-zoomed/
標準模式與放大模式
iPhone6和6+的設置(Settings)->顯示與亮度(Display & Brightness)->顯示模式(View)都帶有標準模式(Standard)和放大模式(Zoomed)。
這個功能被引入后,依賴[UIScreen bounds]和[UIScreen scale]并不能完全確定屏幕分辨率是多大、用戶選擇了放大試圖還是標準視圖。比如放大模式下iPhone6讀到的這兩個屬性和iPhone5是一模一樣的,而放大模式下iPhone6+的[UIScreen bounds]屬性和標準模式下iPhone6的一樣。
iOS8中蘋果引入了[UIScreen screenScale],可以用來區分不同的顯示模式。
關于[UIScreen screenScale]
官方文檔給出的解釋則非常惜字如金:
The native scale factor for the physical screen. (read-only)
何為native scale factor? 寫文檔這哥們有點懶啊,妥妥的中國大陸互聯網公司文檔范兒,搞不好是本著’不知道上層用戶用得著用不著先開放了再說’的原則做的底層。猜測是物理分辨率與[UIScreen bounds]的比值。光猜不放心,最好還是做個實驗看下這個猜測是不是對的。
CGRect bounds = [[UIScreen mainScreen] bounds];
NSString *screenMode = [[UIScreen mainScreen].coordinateSpace description];
CGFloat scale = [[UIScreen mainScreen] scale];
CGFloat nativeScale = [[UIScreen mainScreen] nativeScale];
NSLog(@"\n bounds: %@\n screen mode: %@\n scale: %f\n native scale: %f", NSStringFromCGRect(bounds), screenMode, scale, nativeScale);
iPhone6標準模式下輸出:
ScreenTest[3441:3088752]
bounds: { {0, 0}, {375, 667} }
screen mode: <UIScreen: 0x155603cd0; bounds = { {0, 0}, {375, 667} }; mode = <UIScreenMode: 0x170021f40; size = 750.000000 x 1334.000000>>
scale: 2.000000
native scale: 2.000000
iPhone6放大模式下輸出:
ScreenTest[3454:3089937]
bounds: { {0, 0}, {320, 568} }
screen mode: <UIScreen: 0x12ee03d40; bounds = { {0, 0}, {320, 568} }; mode = <UIScreenMode: 0x1700256e0; size = 640.000000 x 1136.000000>>
scale: 2.000000
native scale: 2.343750
2.343750是個啥?1134/568是2.34859154,比較接近了。而750/320就是2.343750。
再來看iPhone6+標準模式下輸出:
ScreenTest[1876:465146]
bounds: { {0, 0}, {414, 736} }
screen mode: <UIScreen: 0x13ee01840; bounds = { {0, 0}, {414, 736} }; mode = <UIScreenMode: 0x17002b4e0; size = 1242.000000 x 2208.000000>>
scale: 3.000000
native scale: 2.608696
iPhone6+放大模式下輸出:
ScreenTest[1893:466244]
bounds: { {0, 0}, {375, 667} }
screen mode: <UIScreen: 0x13f6021f0; bounds = { {0, 0}, {375, 667} }; mode = <UIScreenMode: 0x170028c20; size = 1125.000000 x 2001.000000>>
scale: 3.000000
native scale: 2.880000
iPhone6+的物理分辨率是1080*1920,1080/414是2.608696,1080/375是2.880000。
需要注意的是此接口從iOS8開始支持。代碼里要用的話記得加個保護。
蘋果希望開發者們怎樣做?
從文檔來推斷,UIKit的設計者可能覺得這個接口使用頻率不會很高,以至于文檔里只給出了一句不清晰的解釋,沒說明比值以寬度計算,也沒給出其他建議。繼續推斷在UIKit的設計者認為[UIScreen bounds]和[UIScreen scale]才是寫layout時主力的檢測分辨率方法,無論是CoreGraphics還是圖片scale選取,都應該以[UIScreen scale]為準。在iPhone6上,無論標準模式還是放大模式,scale始終是2,所以繪制和圖片都應該選擇2倍大小;iPhone6+上,無論標準模式還是放大模式,scale始終是3,所以繪制和圖片都應該選擇3倍大小。
當然UIKit并不是開發UI的唯一方式,于是[UIScreen nativeScale]有了其存在的更多意義,尤其是做偏底層的繪制工作時。
Over
參考資料: http://blog.csdn.net/xiaoyuanzhiying/article/details/44080667