1. 程式人生 > >【iOS】螢幕適配

【iOS】螢幕適配

螢幕適配

1、螢幕適配的發展過程:

程式碼計算frame -> autoreszing(父控制元件和子控制元件的關係) -> autolayout(任何控制元件都可以產生關係) -> sizeclass

 

沒有螢幕適配,直接使用frame固定子控制元件的大小

螢幕大小一樣,但是如果進行ipad開發,就需要考慮螢幕適配

螢幕大小不一樣,需要考慮螢幕適配(使用autoresizing/autolayout實現)

autoresizing:ios7之前經常使用

autolayout:ios6開始出現,ios7之後大範圍使用

sizeclass:ios8開始出現,解決橫豎屏和iphone、ipad共同開發

 

 

2、autoreszing

- 需要去除autolayout選項,因為這兩個屬性衝突。view的autoresizesSubviews屬性為yes時(預設為yes),autoresizing才會生效

- 從XCODE6開始,Storyboard&Xib預設是自動佈局,因此我們需要手動調整,才能使用autoresizing

- autoresizing的侷限性

     它只能描述父子控制元件之間的佈局關係,而不能描述子控制元件與子控制元件之間的佈局關係

 

 

3、autolayout

 

要先禁止autoresizing功能,設定view的下面屬性為NO

      view.translatesAutoresizingMaskIntoConstraints = NO;
    > 新增約束之前,一定要保證相關控制元件都已經在各自的父控制元件上

    > 不用再給view設定frame

 

使用autolayout不再需要設定子控制元件的frame

  • 通過使用父子控制元件之間的約束 或者 子控制元件與子控制元件之間的約束進行frame的設定。

 

-好處:

  • 你基本上可以不用考慮螢幕不同解析度的問題,你終於可以不用在viewDidLoad方法裡判斷不同解析度下,不同控制元件應該放在哪裡,或者針對不同解析度寫不同的storyboard和xib
  • 你可以拋棄那些根據不同文字來計算tableViewCell、UILabel高度的程式碼了,因為autolayout會幫你自動計算好
  • 如果你的佈局在橫屏豎屏下變化不是特別大,你不用再為橫著豎著寫兩套程式碼或者寫兩個storyboard/xib了

 

警告和錯誤

      1)、警告(黃色提示)
        * 控制元件的frame不匹配所新增的約束, 比如比如約束控制元件的寬度為100, 而控制元件現在的寬度是110
      2)、錯誤(紅色提示)
        * 缺乏必要的約束, 比如只約束了寬度和高度, 沒有約束具體的位置

        * 兩個約束衝突, 比如1個約束控制元件的寬度為100, 1個約束控制元件的寬度為110

 

 

4、sizeclass

僅僅是對螢幕進行了分類, 真正排布UI元素還得使用autolayout
* 不再有橫豎屏的概念, 只有螢幕尺寸的概念
* 不再有具體尺寸的概念, 只有抽象尺寸的概念
* 把寬度和高度各分為3種情況
1) Compact : 緊湊(小)
2) Any : 任意
3) Regular : 寬鬆(大)
4) 符號代表
- : Compact
* : Any

+ : Regular