一道宅、屏幕適配
iOS的屏幕適配可以分為3大塊魏滚,代表著不同時(shí)期的屏幕適配主流:
AutoResizing:
在iOS6之前,完全能夠勝任谦秧,因?yàn)楫?dāng)時(shí)蘋(píng)果只有3.5寸屏,加上比較少的支持橫屏撵溃,它有非常大的局限性:只能相對(duì)于父控件布局
-
AutoLayout:
在iOS6之后疚鲤,蘋(píng)果多了幾個(gè)尺寸屏幕,AutoResizing已經(jīng)無(wú)能為力了缘挑,這時(shí)候蘋(píng)果推出了AutoLayout集歇,功能十分強(qiáng)大,可以再任意兩個(gè)控件之間建立布局關(guān)系语淘,也是現(xiàn)在的主流鬼悠。 -
SizeClass:
隨著iOS8系統(tǒng)的發(fā)布,一個(gè)全新的頁(yè)面UI布局概念出現(xiàn)了亏娜,顛覆了之前版本的UI布局方式焕窝,這個(gè)特性就是SizeClass,SizeClass配合AutoLayout可以解決所有iOS設(shè)備屏幕UI適配問(wèn)題
下面我們來(lái)一個(gè)一個(gè)了解维贺,因?yàn)樯婕暗経I布局它掂,可能圖片或者GIF比較多,大家要有心理準(zhǔn)備溯泣。
二虐秋、AutoResizing【iOS6之前使用】
這個(gè)已經(jīng)被時(shí)代所淘汰的界面UI適配方式,現(xiàn)在就只是簡(jiǎn)單的了解下垃沦,也好為下面的AutoLayout出現(xiàn)說(shuō)明時(shí)代背景客给。
AutoResizing
的功能只能相對(duì)于父控件布局:
在用
autoResizing
的時(shí)候需要關(guān)閉autoLayout
和sizeclass
(如果是用xcode6)
他們之間是互相沖突的
上面有6根線,分別對(duì)應(yīng)下方的6個(gè)枚舉:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
- 四周4根線是用來(lái)設(shè)置當(dāng)前View距離父控件的上下左右的距離是否固定
- 中間2根線是用來(lái)設(shè)置當(dāng)前View是否隨父控件自適應(yīng)調(diào)整寬度和高度
可以看到肢簿,上面的設(shè)置只能設(shè)置當(dāng)前控件和父控件之間的布局靶剑,無(wú)法實(shí)現(xiàn)兄弟控件之間的布局蜻拨,例如:如果我想讓2個(gè)控件View之間的間隔固定,使用AutoResizing
是無(wú)法實(shí)現(xiàn)的桩引。
二缎讼、AutoLayout【iOS6之后使用】
因?yàn)锳utoResizing的種種局限已經(jīng)無(wú)法滿足iOS6之后新出的不同尺寸屏幕的需求,做iOS開(kāi)發(fā)的好處就是有一個(gè)很好的東家坑匠,蘋(píng)果不僅很重視用戶體驗(yàn)血崭,而且對(duì)開(kāi)發(fā)者也很友好,例如ARC厘灼、AutoLayout夹纫。
AutoLayout是現(xiàn)在使用的主流屏幕適配方式,它可以在任意兩個(gè)控件之間建立布局關(guān)系设凹,可以是父子View捷凄,也可以是兄弟View,功能強(qiáng)大很多围来,學(xué)習(xí)成本也高了不少跺涤。
使用AutoLayout:
AutoLayout設(shè)置界面有3個(gè):
- 對(duì)齊布局界面
- 相對(duì)布局界面
- 約束管理界面
1. 對(duì)齊布局界面:
點(diǎn)擊右下角的類(lèi)似樓梯的按鈕
可以分為3個(gè)功能部分:
- 上面4個(gè)是控件邊界對(duì)齊布局
- 中間3個(gè)是控件中心對(duì)齊布局
- 下面2個(gè)是父子控件中心對(duì)齊布局
上面7個(gè)對(duì)齊布局,需要選擇多個(gè)View進(jìn)行設(shè)置监透。
2. 相對(duì)布局界面
點(diǎn)擊右下角的正方形按鈕
分為4個(gè)功能部分:
- 最上面的是相對(duì)附近控件距離設(shè)置
- Width和Height是設(shè)置控件的寬高
- 緊接著下面3個(gè)是多個(gè)控件之間的等寬等高約束
- 最下面的是對(duì)齊設(shè)置桶错,這個(gè)功能和上面的對(duì)齊布局界面功能重復(fù)
3. 約束管理界面
點(diǎn)擊右下角的小三角按鈕:
分為2個(gè)大功能區(qū)域:
- 分割線上面的是選中View的約束管理,最常用的是
Updata Frames
- 分割線下面的是容器中所有的View的約束管理胀蛮,最常用的也是
Updata Frames
4. 通過(guò)control按鍵配合拖線也可以做AutoLayout
5. 修改約束
界面右邊會(huì)有約束列表:
雙擊其中一個(gè)約束院刁,進(jìn)入修改約束界面:
大概意思可以理解為:
FirstItem = SecondItem * Multiplier + Constant
view1.width = view2.width * 1 + 0
-> view1.width = view2.width
三、AutoLayout實(shí)踐
AutoLayout實(shí)踐例子說(shuō)明:
- 兩個(gè)View等寬等長(zhǎng)
- 兩個(gè)View距離屏幕水平中心距離相等
- 兩個(gè)View距離父控件的左右邊界距離固定
最終效果圖:
1. 設(shè)置2個(gè)View等寬等高
2. 設(shè)置藍(lán)色View左右距離
3. 設(shè)置藍(lán)色View到父控件中心Y軸的距離
4. 設(shè)置紅色View到父控件中心Y軸的距離【記住是負(fù)的】
5. 設(shè)置紅色View左右距離
6. 設(shè)置藍(lán)色View的高度
7. 使用更新界面
8. 最終效果
四粪狼、SizeClass
SizeClass就是對(duì)屏幕尺寸進(jìn)行了抽象退腥,不再拘泥于具體的尺寸,因?yàn)槌叽缫恢倍荚谧兓匍绻覀儼凑粘叽缛ミm配狡刘,一定會(huì)很累。
SizeClass對(duì)屏幕進(jìn)行了抽象分類(lèi):
- compact:緊湊-小
- Any:任意
- Regular:寬松-大
總結(jié)幾點(diǎn):
SizeClass
只是對(duì)屏幕進(jìn)行了抽象分類(lèi)困鸥,具體屏幕適配還是要使用AutoLayout
來(lái)進(jìn)行嗅蔬。
- 沒(méi)有了橫豎屏的概念,也沒(méi)有了具體尺寸的概念疾就,就不必理會(huì)具體設(shè)備是什么
- 寬度和高度都抽象為上面的3種澜术,3*3一共就是9種類(lèi)型,但不是9種屏幕尺寸
所以使用了SizeClass的Xcode的storyboard變成了這個(gè)樣子:
下方還變成了這樣:
具體解析看下圖:
比如iPhone的豎屏猬腰,它是這么抽象的:
五鸟废、SizeClass使用實(shí)例
以前看來(lái)有這樣一個(gè)變態(tài)的要求:
有個(gè)View是100*100的,在iPhone豎屏是居于左上角姑荷,橫屏?xí)r在右下角盒延,是iPad時(shí)它在正中間
現(xiàn)在用SizeClass可以簡(jiǎn)單實(shí)現(xiàn):
處理iPhone豎屏:
先用SizeClass固定屏幕為iPhone豎屏:compactWith | RegularHeight
添加約束缩擂,讓View寬度、高度都為100兰英,距離左上角都是20撇叁,再UpdataFrames:
后面的都類(lèi)似這樣處理供鸠,只不過(guò)需要選對(duì)正確的SizeClass畦贸,這里就不啰嗦了。
除了這個(gè)楞捂,iOS8加了SizeClass后薄坏,一些控件也多了一些屬性,例如:
在右邊的菜單區(qū)域可以看到:installed寨闹,這個(gè)是用來(lái)控制改控件什么情況下顯示胶坠,當(dāng)前什么都沒(méi)約束,表示Any * Any繁堡,就是不管是iphone什么尺寸還是ipad什么尺寸都可以顯示沈善,點(diǎn)擊左邊的小加號(hào)+可以用sizeclass控制什么情況顯示;同樣的還有字體椭蹄、圖片顯示: