[toc]
1 屏幕適配簡介
1.1 屏幕發(fā)展歷史
手機型號 |屏幕大小 | 分辨率
------------ | -------------
4, 4S |3.5 | 320480
5,5C,5S | 4 | 320568
6,6S , 7 | 4.7 | 375667
6Plus, 6S Plus, 7 Plus | 5.5 | 414736
iPAD | 9.7 | 7681024
iPAD Pro | 12.9 | 10241366
1.2 適配技術發(fā)展史
iOS版本 | 適配技術 | Xcode版本 | 正式版發(fā)布時間 | 手機機型
----------|----------- |-----------|-----------
iOS 5 | Autoresizing | Xcode4.2 | 2011年10月13日 | iPhone 4S
iOS 6 | Auto Layout | Xcode4.5 | 2012年09月20日 | iPhone 5
iOS 8 | Size Classes + Auto Layout | Xcode6.0.1 | 2014年09月17日 | iPhone 6
iOS 9 | Size Classes + Auto Layout + StackView |Xcode7.0 | 2015年09月28日 | iPhone 6S
1.3 適配技術介紹
直接使用 frame 計算控件的位置
特點:程序中存在大量的 MagicNumber
iPhone\ iPhone3G \ iPhone3GS \ iPhone4 \ iPhone4S 屏幕的物理尺寸是一樣的(無需屏幕適配)
而且一個應用要么是橫屏要么是豎屏, 幾乎不存在能同時進行橫豎屏切換的應用
應用程序都是豎屏
游戲幾乎都是橫屏
官方應用大多支持橫豎屏
使用 Autoresizing 進行屏幕適配
隨著 iPad 的發(fā)布, 屏幕的物理尺寸發(fā)生了變化
并且蘋果建議嗤瞎,在 iPad 上運行的程序如果沒有特殊原因蕊连,應該支持橫豎屏切換
因此:不能把控件的 frame 都寫死了鳞陨,需要進行屏幕適配
為了解決屏幕適配需求,蘋果同時推出了第一個屏幕適配解決方案:Autoresizing
Autoresizing 的核心思想就是:參照父容器來設置子控件的 frame
不再寫死 frame, 而是參照父容器
舉例:在豎屏下有一個按鈕要占據整個屏幕寬度, 當切換到橫屏以后同樣要占據整個屏幕的寬度
Autoresizing 只能設置當前控件與父控件之間的相對關系
iOS 6 —— Auto Layout(自動布局)
隨著 iPhone5 \ iPhone5s 等的發(fā)布蘋果設備不同尺寸的屏幕變得越來越多, 不僅要求能根據控件父子
關系來設置相對位置,也要求能根據任意控件之間的關系來設置位置因為 Autoresizing 只能設置當前控件
與父控件之間的相對關系撬即,當遇到要設置兄弟控件之間的關系的時候 Autoresizing 就無能為力了
舉例: 在豎屏下, 屏幕底部有兩個按鈕库菲,這兩個按鈕的間距為一個固定的值(寬度不指定)
當切換為橫屏的時候要求這兩個按鈕還顯示在屏幕底部
并且按鈕間的間距不變, 按鈕可以隨之變寬
Auto Layout 技術主要解決的問題:控件位置的參照關系不再局限于父控件
iOS 8 —— Size Classes + Auto Layout
使用 Size Classes + Auto Layout 進行屏幕適配
當 iPhone6 發(fā)布以后,蘋果設備的屏幕越來越多(以后也可能出現更多不同大小的屏幕)卫旱,為了能更容易的適配不同
的屏幕,蘋果推出了 Size Classes 技術
通過 Auto Layout 設置的約束围段,約束一旦添加就會應用于各種屏幕(也就是說在
各種不同的屏幕下都使用相同的約束)
通過 Size Classes + Auto Layout 的方式, 可以為不同尺寸的屏幕設置不同的約束
舉例: iPhone 下的計算器顾翼,在橫屏、豎屏下的不同表現
Size Classes 技術主要解決的問題: "主要解決了iPhone橫豎屏適配及iPhone和iPad開發(fā)時共用一個SB的問題"
iOS 9 —— Size Classes + Auto Layout + StackView
StackView 的核心便是方便垂直或水平排布多個 subview
類似于 android 的 LinearLayout
StackView 最有用的就是它會自動為每個 subview 創(chuàng)建和添加 Auto Layout 約束奈泪,程序員可以
通過選項配置subview的大小适贸、排布以及彼此間的間距
使用 stackview 主要簡化在線性方向上,重復設置控件布局約束的問題
2 Autoresizing
- 只是為了介紹, 以后不要用 Autoresizing涝桅,都用 Auto Layout
- 一定記装葑恕:在一個視圖中 Autoresizing 和 Auto Layout 只能用其一,通過 Autoresizing 解決布局問題,首先取消掉 Auto Layout
2.1 StoryBoard中使用Autoresizing
注意 ??:子控件和父控件貼邊的時候冯遂,有特殊情況蕊肥。
2.1.1 外面四根線
- 表示子控件距離父控件的四周邊距是否固定
2.1.2 里面兩根線
- 子控件的寬高是否隨著父控件的寬高變化
2.2 代碼中使用Autoresizing
- AutoresizingMask 屬性。代碼就只用這個蛤肌。
redView.AutoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
3 Auto Layout
3.1 在StoryBoard 中使用
核心公式
firstItem.firstAttribute {==,<=,>=} secondItem.secondAttribute * multiplier + constant
注意:如果firstItem.firstAttribute和secondItem.secondAttribute調換位置后注意multiplier和constant值的變化
3.2 通過代碼修改constraints in AutoLayout
- 將constraints連線屬性
- 調用屬性晴埂,重新賦值就可以了。
- 更改約束后,在block動畫中調用layoutIfNeeded
//修改constraints不代表直接改了frame寻定,誰調用此方法儒洛,就會讓自己及內部所有子控件立即根據constraints 更新 frame
[self. view layoutIfNeeded];
3.3 代碼中使用AutoLayout的注意點:
3.3.1 規(guī)則一
1.要先禁止Autoresizing功能,設置view的下面屬性為NO
約束要作用的view.translatesAutoresizingMaskIntoConstraints = NO;
2.添加約束之前狼速,一定要保證相關控件都已經在各自的父控件上
3.不用再給控件設置frame
3.3.2 規(guī)則二
1.如果添加的約束和其它控件沒有關系, 要添加到自己身上"也可以添加在父控件上"
2.如果是父子關系, 設置子控件的約束, 約束要添加到父控件上
3.如果是兄弟關系, 設置兩兄弟的約束, 約束要添加到它們最近的共同父控件上
示例圖如下: