iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前
? ? ? ? ? ?對于不同的蘋果設備。檢查每個參數《iOS:機型參數、sdk、xcode各版本號》。
? ? ? ?機型變化
? ? ? ? ? 坐標:表示屏幕物理尺寸大小,坐標變大了。表示機器屏幕尺寸變大了;
? ? ? ? ? 像素:表示屏幕圖片的大小,跟坐標之間有個相應關系,比方1:1或1:2等;
? ? ? ? ? ppi:代表屏幕物理大小到圖片大小的比例值,假設ppi不變,則坐標和像素的比例不會變;
? ? ? ? ?iPhone 4曾經
iPhone、iPhone3/3G機型未採用retina。坐標是320 x 480,屏幕像素320 x 480 ,他們一一相應。1:1關系。即一個坐標相應1個像素。? ? ? ? ?iPhone 4/4s
機器採用了retina屏幕。坐標是320 x 480。屏幕像素640 x 960,他們之間是1:2關系。即一個坐標相應2個像素。
? ? ? ? ?iPhone 5/5s/5c
機器採用了retina屏幕。坐標是320 x 568,屏幕像素640 x 1136。他們之間關系式1:2關系。即一個坐標相應2個像素。? ? ? ? ?iPhone 6
機器採用了retina屏幕。坐標是375, 667,屏幕像素750 x 1334,他們之間關系式1:2關系。即一個坐標相應2個像素。? ? ? ? ?iPhone 6 plus
機器採用了retina屏幕,坐標是414, 736,屏幕像素1080 x 1920。他們之間關系式1:2.6關系。即一個坐標相應2.6個像素。? ? ? ?適配方法:
- 在iPhone 4s之后,不同機型,屏幕大小坐標不變,跟實際圖片大小比例不是1:1就是1:2關系。由于坐標不變,所以在開發中能夠使用絕對定位,確定每一個視圖位置。同一時候提供倆套圖片,~.png和~@2x.png。系統依據機器的分辨率自己主動決定使用哪張圖片。
- iPhone 5/5s/5c之后,由于屏幕大小坐標已變,高度添加568 - 480 = 88個點,再使用絕對定位的方式,會導致程序高度不夠,假設程序未做適配。系統會將多出來的88個點將會將會被自己主動均分為上下兩部分,使得上下出現黑邊。相應不同機型,屏幕坐標大小改變了。不能再絕對定位了,為了解決問題,ios出現了一種新技術:AutoLayout。AutoLayout能夠解決不同機型,屏幕大小的變化。至于圖片的適配。由于5/5s/5c,坐標:像素 = 1:2。所以直接使用@2x.png圖片即可。
- iPhone 6之后,由于屏幕大小坐標已變。寬、高都增大。可是寬、高比例不變,類似之前的處理方式,使用AutoLayout自己主動適配,坐標:像素 = 1:2。使用@2x.png圖片。
綜合之前的,@2x圖片能夠依照750 x 1334規格來。 - iPhone 6 plus,類似之前使用AutoLayout,在使用圖片的時候,由于 坐標:像素 = 1:2.6,理論上使用@2.6x.png圖片就可以。可是這不是整數。實際使用非常不方便。而@2x 和 @3x 都不太行得通,怎么辦?
? ? ? ? ? ?引用一段文字說的非常好: ?
? ? ? ? ? ?“不是現有的屏幕物理分辨率明顯超過了 @2x 但還達不到 @3x 的水平么?那我們歪歪一個滿足 @3x 的屏幕總能夠吧?
? ? ? ? ? ? 對的。歪歪。
? ? ? ? ? ? 程序在 iPhone 6 Plus 上執行的時候,iOS 會騙它說,你執行在一個超大的 @3x Retina 顯示屏上,物理分辨率高達 1242 x 2208,邏輯分辨率是 414 x 736,兩者都比 iPhone 6 要大。然后作為設計師和開發者,也跟著一起歪歪。設計師繪圖的時候要把屏幕當成 1242 x 2208 來繪圖(并且要提供@3x 的高清圖),開發者也依照 414 x 736 的邏輯分辨率來敲代碼。
? ? ? ? ? ? 但借來的總要還的。
等咱們歪歪結束了以后。iOS 拿到這個假大的 UI 繪制結果。實時地再縮小到實際的 1080 x 1920 分辨率(系統通過某種算法)。于是,用戶在 iPhone 6 Plus 的屏幕上看到的永遠是被縮小了的圖像:
? ? ? ? ? 這么做使得設計和開發的過程大大簡化。且最后的實際縮放系數 @2.62x 很接近理想的 @2.46x。使得相同的素材在真機上看起來尺寸也很合理:
? ? ? ? 其它:
? ? ? ? 代碼中的尺寸不要使用480、460這種絕對數值。使用的UIScreen取設備的尺寸。
? ? ?開啟適配?(手動/自己主動)
? ? ? ? 在某機型上,假設是自己主動適配,比方iPhone 5,老版程序就會在屏幕上、下倆端多出倆塊黑條;比方iPhone6/6plus。老版程序就會自己主動等比拉伸。那怎樣關閉自己主動適配?
? ? ? ? 指定啟動圖(比如iPhone 5為Default-568h@2x.png)或者使用Launch Screen File.xib。即程序使用手動適配,不會做拉伸等。可是程序內部必須已做處理。否則使用自己主動適配方案。
??
? ? ?總結:
- 不同機型適配可看成兩部分,一是屏幕大小適配(坐標),一是像素適配;前者依據不同的機型大小,視圖大小自己主動適應(AutoLayout);后者依據機型的分辨率和坐標比率,提供合適@xx圖片。
- 眼下4s、5/5s/5c、6的適配,使用圖片部分,都是使用@2x的圖片,在不同的機器上肯定會有一定的拉伸、縮小,眼下沒看到什么好的解決方式,推薦圖片按大圖標準做;
- 趨勢:機器屏幕的大小可能會越來越多。絕對定位的方式肯定不行。使用AutoLayout,自己主動適配屏幕大小,類似網頁的思想來設計界面。
- 趨勢:xcode 6中已經能夠使用矢量圖了,能夠使用矢量圖。避免各種規格圖片;
- 對于設計師:
(1)非矢量素材。就能夠做尺寸最大的。之后再進行縮小。比方你須要兼容3x的屏幕,就直接做最高那種圖片。由于之后幾種機型長寬比都是9:16,能夠直接拉伸。
(2)已有非矢量素材,直接拉伸放大到@3x。
(3)而當使用Flash之類的矢量工具來做素材的時候。應該直接做點那個尺寸。比方44 x 66個點的button。就建立一個44 x 66的場景。
之后再導出成2倍圖,3倍圖,由于矢量放大不失真。不要建立一個3x的場景,導出成大圖片,再進行縮小,這樣就easy失真。
須要拉伸的話,橫方向就不要出現一些漸變色。
--2.button的點擊區域,不應該少于44pt(太小不易點中)。就算button的圖片看起來比較小,也應該使得點button周圍的透明區也有反應。
? ? ? ? 實際操作方案:
下面是個人觀點,有沒有更好的或者不正確的。有待驗證、提升。- 方案(1):
效果:(高)各視圖、button、cell、bar高度。高度間距固定(坐標)。不同屏幕高度顯示的cell多少不同。各bar。btn離屏幕頂部。或者占屏幕底部位置不變;(寬)各視圖、button、cell、bar的寬度隨屏幕大小變化而變化。
實現方法:
(高):代碼中用#define定義各控件高度,xib中直接寫死各控件高度。父視圖用ScreenHeight調節高度。
(寬):
1.代碼中各控件寬度用效果圖里“控件寬度/圖寬度.00”這個比例x,x*ScrrenWeight計算控件的寬度,父視圖用ScrrenWeight調節;
2.xib中使用autoRisizing約束寬度;父視圖代碼中用ScrrenWeight調節寬度。 - 方案(2):
效果:各視圖、button、cell、bar寬高隨著不同屏幕大小,合適縮放。
實現方法:
1.高度適配參考上文中寬度適配;
2.代碼中手寫Autolayout的約束條件,NSLayoutConstraint相關類或者xib中使用AutoLayout。父視圖用ScrrenSize調節寬度。 - 說明:
1.(對于控制器創建完,不同屏幕控制器xib初始大小為多少,是屏幕大小還是xib設置的某個大小,未研究過,不知道,在代碼中用ScrrenSize調節保險)。
2.對于高度固定,僅僅是在寬度一個方向做適配的話,假設用Autolayout的話,會有一堆警告,高度上面不做約束,自己主動變化調節不出來;假設高度上也做了約束,那么就不是在一個方向上適配的前提了。
參考: 《具體解釋 iPhone 6 Plus 的奇葩分辨率》http://j.news.163.com/docs/99/2014091214/A5V1I08A9001I08B.html
《iPhone屏幕適配,歷史及現狀》http://hjcapple.github.io/2014/10/10/iphone-screen.html 《APP設計師必讀-高速適配iPhone6及plus的訣竅》http://www.ui.cn/project.php?
id=25685
《iPhone6分辨率與適配》http://www.cocoachina.com/ios/20140912/9601.html版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习日志-中缀表达式转后缀表达式并计算结
- 下一篇: SharePoint自动化系列——Sol