iOS屏幕適配概述

[toc]

1 屏幕適配簡介

1.1 屏幕發(fā)展歷史

手機型號 |屏幕大小 | 分辨率
------------ | -------------
4, 4S |3.5 | 320480
5,5C,5S | 4 | 320
568
6,6S , 7 | 4.7 | 375667
6Plus, 6S Plus, 7 Plus | 5.5 | 414
736
iPAD | 9.7 | 7681024
iPAD Pro | 12.9 | 1024
1366

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.如果是兄弟關系, 設置兩兄弟的約束, 約束要添加到它們最近的共同父控件上

示例圖如下:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末琅锻,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子向胡,更是在濱河造成了極大的恐慌恼蓬,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僵芹,死亡現場離奇詭異处硬,居然都是意外死亡,警方通過查閱死者的電腦和手機拇派,發(fā)現死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門荷辕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凿跳,“玉大人,你說我怎么就攤上這事疮方】厥龋” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵骡显,是天一觀的道長疆栏。 經常有香客問我,道長惫谤,這世上最難降的妖魔是什么壁顶? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮溜歪,結果婚禮上若专,老公的妹妹穿的比我還像新娘。我一直安慰自己痹愚,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布蛔糯。 她就那樣靜靜地躺著拯腮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚁飒。 梳的紋絲不亂的頭發(fā)上动壤,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音淮逻,去河邊找鬼琼懊。 笑死,一個胖子當著我的面吹牛爬早,可吹牛的內容都是我干的哼丈。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼筛严,長吁一口氣:“原來是場噩夢啊……” “哼醉旦!你這毒婦竟也來了?” 一聲冷哼從身側響起桨啃,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤车胡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后照瘾,有當地人在樹林里發(fā)現了一具尸體匈棘,經...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年析命,在試婚紗的時候發(fā)現自己被綠了主卫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃默。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖队秩,靈堂內的尸體忽然破棺而出笑旺,到底是詐尸還是另有隱情,我是刑警寧澤馍资,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布筒主,位于F島的核電站,受9級特大地震影響鸟蟹,放射性物質發(fā)生泄漏乌妙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一建钥、第九天 我趴在偏房一處隱蔽的房頂上張望藤韵。 院中可真熱鬧,春花似錦熊经、人聲如沸长豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吁断。三九已至,卻和暖如春槐壳,著一層夾襖步出監(jiān)牢的瞬間然低,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工务唐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雳攘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓枫笛,卻偏偏與公主長得像吨灭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刑巧,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容