文章轉(zhuǎn)自:http://openfibers.github.io/blog/2015/03/10/uiscreen-nativescale-method-handle-standard-zoomed/
標(biāo)準(zhǔn)模式與放大模式
iPhone6和6+的設(shè)置(Settings)->顯示與亮度(Display & Brightness)->顯示模式(View)都帶有標(biāo)準(zhǔn)模式(Standard)和放大模式(Zoomed)举农。
這個(gè)功能被引入后唉窃,依賴[UIScreen bounds]和[UIScreen scale]并不能完全確定屏幕分辨率是多大惩嘉、用戶選擇了放大試圖還是標(biāo)準(zhǔn)視圖挠阁。比如放大模式下iPhone6讀到的這兩個(gè)屬性和iPhone5是一模一樣的,而放大模式下iPhone6+的[UIScreen bounds]屬性和標(biāo)準(zhǔn)模式下iPhone6的一樣硫朦。
iOS8中蘋果引入了[UIScreen screenScale]贷腕,可以用來區(qū)分不同的顯示模式。
關(guān)于[UIScreen screenScale]
官方文檔給出的解釋則非常惜字如金:
The native scale factor for the physical screen. (read-only)
何為native scale factor? 寫文檔這哥們有點(diǎn)懶啊咬展,妥妥的中國大陸互聯(lián)網(wǎng)公司文檔范兒泽裳,搞不好是本著’不知道上層用戶用得著用不著先開放了再說’的原則做的底層。猜測是物理分辨率與[UIScreen bounds]的比值破婆。光猜不放心诡壁,最好還是做個(gè)實(shí)驗(yàn)看下這個(gè)猜測是不是對的。
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標(biāo)準(zhǔn)模式下輸出:
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是個(gè)啥荠割?1134/568是2.34859154,比較接近了旺矾。而750/320就是2.343750蔑鹦。
再來看iPhone6+標(biāo)準(zhǔn)模式下輸出:
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開始支持。代碼里要用的話記得加個(gè)保護(hù)柬帕。
蘋果希望開發(fā)者們怎樣做哟忍?
從文檔來推斷狡门,UIKit的設(shè)計(jì)者可能覺得這個(gè)接口使用頻率不會很高,以至于文檔里只給出了一句不清晰的解釋锅很,沒說明比值以寬度計(jì)算其馏,也沒給出其他建議。繼續(xù)推斷在UIKit的設(shè)計(jì)者認(rèn)為[UIScreen bounds]和[UIScreen scale]才是寫layout時(shí)主力的檢測分辨率方法爆安,無論是CoreGraphics還是圖片scale選取叛复,都應(yīng)該以[UIScreen scale]為準(zhǔn)。在iPhone6上扔仓,無論標(biāo)準(zhǔn)模式還是放大模式褐奥,scale始終是2,所以繪制和圖片都應(yīng)該選擇2倍大星檀亍撬码;iPhone6+上,無論標(biāo)準(zhǔn)模式還是放大模式版保,scale始終是3呜笑,所以繪制和圖片都應(yīng)該選擇3倍大小。
當(dāng)然UIKit并不是開發(fā)UI的唯一方式找筝,于是[UIScreen nativeScale]有了其存在的更多意義蹈垢,尤其是做偏底層的繪制工作時(shí)。
Over
參考資料: http://blog.csdn.net/xiaoyuanzhiying/article/details/44080667