隨著iphone每年的更新?lián)Q代,作為ios程序猿也有了幸福的煩惱,不得不考慮各種屏幕的適配。
首先,我們從iphone的歷史說起,初代iphone(iphone 3GS)屏幕320 x 480 像素。那個(gè)時(shí)候也只是支持絕對(duì)定位。比如一個(gè)按鈕(x, y, width, height) = (20, 30, 40, 50),就表示它的寬度是40像素,高度是50像素,放在(20, 30)像素的位置。
隨著iphone4 發(fā)布,率先采用Retina顯示屏,在屏幕的物理尺寸不變的情況下,像素成倍增加,達(dá)到640 x 960 像素。
這樣就出現(xiàn)一個(gè)問題,怎么讓原有的App運(yùn)行在新的手機(jī)上面?iPhone手機(jī)一個(gè)優(yōu)勢(shì),就是有眾多優(yōu)秀的App,假如不兼容原有的App,就相當(dāng)于放棄這個(gè)得來不易的優(yōu)勢(shì),是很不明智的。
每當(dāng)iPhone的屏幕有所變化,比如iPhone 3GS過渡到iPhone 4, iPhone 4過渡到iPhone 5, iPhone 5過渡到iPhone 6,蘋果公司都需要想辦法來解決上述的兼容問題。
為了運(yùn)行之前的App,引入一個(gè)新的概念point(點(diǎn))。點(diǎn)這個(gè)概念在iOS開發(fā)中十分重要,而實(shí)際用戶很少關(guān)注。iPhone 4屏幕尺寸繼續(xù)保持320 x 480,不過單位并非是像素,而是點(diǎn)。
在iPhone 3GS中,1個(gè)點(diǎn)等于1個(gè)像素。也就是說,點(diǎn)跟像素可以直接互換。
在iPhone 4中,1個(gè)點(diǎn)等于2個(gè)像素。
這篇文章中,我將點(diǎn)和像素當(dāng)成一維的長度單位,而非二維的面積單位,這樣對(duì)于我來說更自然些,因此1個(gè)點(diǎn)等于2個(gè)像素。別的文章中可能會(huì)說1個(gè)點(diǎn)等于4個(gè)像素,其實(shí)是指1個(gè)點(diǎn)占據(jù)了4個(gè)像素的面積,這樣也沒有說錯(cuò),注意上下文語境。
iPhone 4和iPhone 3GS的屏幕尺寸實(shí)際上是一樣的,都是3.5英寸。同樣一個(gè)點(diǎn),實(shí)際上看起來是一樣的。只是iPhone 4在單位英寸上像素更多,看起來更細(xì)膩。
開發(fā)iOS的時(shí)候,使用點(diǎn)作為基本單位會(huì)更加方便。列表對(duì)比

這里的屏幕模式可以初步理解成,一個(gè)點(diǎn)等于多少個(gè)像素。2x,就是1個(gè)點(diǎn)等于2個(gè)像素。
總結(jié)一下單位
手機(jī)屏幕的物理長度,使用英寸作為單位。比如iPhone 4屏幕是3.5英寸,iPhone 5 是4英寸,iphone 6是4.7英寸,這里的數(shù)字是指手機(jī)屏幕對(duì)角線的物理長度。
屏幕像素,比如iPhone 3GS屏幕是320 x 480像素,iPhone 4是640 x 960像素,這里的像素可以想象成屏幕上真正用來顯示顏色的發(fā)光小點(diǎn)。
點(diǎn),開發(fā)App時(shí)候使用的單位,是一個(gè)虛擬的單位,并非實(shí)際存在的,因此點(diǎn)有時(shí)也叫虛擬點(diǎn)。點(diǎn)這個(gè)單位,用于屏蔽各個(gè)屏幕設(shè)備的不同,兼容以前的程序。
每英寸有多少個(gè)像素,稱為ppi(pixel per inch)。iPhone 4的屏幕是640 x 960像素,3.5英寸,我們沒有寬高的實(shí)際尺寸,就按照對(duì)角線來粗略計(jì)算它的ppi。將像素當(dāng)做長度單位,根據(jù)勾股定理,對(duì)角線就是1154像素。屏幕對(duì)角線的實(shí)際長度為3.5英寸,也就是1154像素除以3.5英寸,得出330ppi。而官方給出的數(shù)字是326ppi。當(dāng)像素太密,超過300ppi的時(shí)候,人眼也就不能區(qū)分出每個(gè)像素。因此iPhone 4的屏幕叫作Retina顯示屏。Retina在英文中,是視網(wǎng)膜的意思。
iPhone 4之后(x, y, width, height) = (20, 30, 40, 50),就表示高度為40個(gè)點(diǎn),寬度為50個(gè)點(diǎn),放在(20, 20)個(gè)點(diǎn)的位置。這種處理方法,將之前以像素作為單位自動(dòng)轉(zhuǎn)換成以點(diǎn)作為單位,使得iPhone 3GS的應(yīng)用程序,不用修改也可運(yùn)行在iPhone 4上面。
文字,顏色等是矢量數(shù)據(jù),放大不會(huì)失真。原有的iPhone 3GS程序,在iPhone 4上面運(yùn)行,文字顯示也十分清晰。
而圖片并非矢量數(shù)據(jù),處理方式有所不同。假設(shè)圖片 example.png,大小為 30 x 40像素(這里的單位是像素,數(shù)字圖片的單位通常都為像素)。當(dāng)這張example.png在iPhone 3GS和iPhone 4中使用時(shí)候,都占據(jù)屏幕上30 x 40個(gè)點(diǎn)。而因?yàn)閕Phone 4中1個(gè)點(diǎn)等于2個(gè)像素,也就是30 x 40像素的圖片,占據(jù)了60 x 80像素的屏幕,因此這圖片在iPhone 4中看起來就會(huì)模糊。
開發(fā)的時(shí)候,為使得圖片清晰,需要進(jìn)行圖片適配。這時(shí)需要準(zhǔn)備兩張內(nèi)容相同的圖片,放在同一目錄下。
example.png // 30 x 40像素example@2x.png // 60 x 80像素
當(dāng)程序中使用example.png的時(shí)候,會(huì)根據(jù)屏幕模式自動(dòng)選擇對(duì)應(yīng)的圖片。屏幕1x模式,就會(huì)選擇example.png, 2x模式就會(huì)優(yōu)先選擇example@2x.png,假如example@2x.png不存在,就選擇example.png。
圖片跟屏幕一樣,也有1x模式,2x模式。在iPhone 6 Plus中,還出現(xiàn)3x模式,原理是一樣的。
當(dāng)iPhone 4選中example@2x.png的圖片,就會(huì)生成一張大小為30 x 40個(gè)點(diǎn),2x模式的圖片。這個(gè)時(shí)候,圖片看起來就會(huì)很清晰了。而沒有適配的舊程序,example@2x.png不存在,就選中example.png,生成大小為30 x 40個(gè)點(diǎn),1x模式的圖片,看起來比較模糊。但它們占據(jù)的屏幕點(diǎn)數(shù)是一樣的。
2012, iphone 5發(fā)布

跟iPhone 4做比較, iPhone 5的寬度保持不變。高度增加568 - 480 = 88個(gè)點(diǎn)。
在iOS開發(fā)中,44這個(gè)數(shù)字比較特殊。iOS界面指南寫著,人類的手指有一定大小,點(diǎn)擊區(qū)域低于44個(gè)點(diǎn)的時(shí)候,就難以點(diǎn)中。44的兩倍就是88。
當(dāng)原有程序沒有適配iPhone 5的時(shí)候,也可以正常運(yùn)行,但多出來的88個(gè)點(diǎn)將會(huì)將會(huì)被自動(dòng)均分為上下兩部分,使得上下出現(xiàn)黑邊
2014年,iPhone 6, iPhone 6 Plus發(fā)布后,情況又有新的變化。再次比較所有iPhone機(jī)型。

轉(zhuǎn)摘http://hjcapple.github.io/2014/10/10/iphone-screen.html