【iOS開發】多屏尺的自動適配 AutoLayout (純程式碼方式) (2014-09-19 09:35:47) 轉載▼
標籤: autolayout ios開發 xcode ui |
分類: Xcode/iOS/MacOS |
關於AutoLayout,最早從iOS6開始引入使用。
主要功能是使用約束,對視圖進行相對布局,以適應不同屏尺的變換。
網上大量的資料都在介紹xib和storyboard,如何使用AutoLayout,說純程式碼使用AutoLayout進行UI布局的越來越少。對於我這個習慣了代碼UI布局的人,寫個備忘:
AutoLayout是什麼。 使用一句Apple的官方定義的話 AutoLayout是一種基於約束的,描述性的布局系統。 Auto Layout Is a Constraint-Based, Descriptive Layout System. 關鍵詞: 基於約束 - 和以往定義frame的位置和尺寸不同,AutoLayout的位置確定是以所謂相對位置的約束來定義的,比如x座標為superView的中心,y座標為螢幕底部上方10像素等 描述性 - 約束的定義和各個view的關係使用接近自然語言或者可視化語言(稍後會提到)的方法來進行描述 布局系統 - 即字面意思,用來負責介面的各個元素的位置。 總而言之,AutoLayout為開發人員提供了一種不同於傳統對於UI元素位置指定的布局方法。以前,不論是在IB裡拖放,還是在代碼中寫,每個UIView都會有自己的frame屬性,來定義其在當前視圖中的位置和尺寸。使用AutoLayout的話,就變為了使用約束條件來定義view的位置和尺寸。這樣的 最大好處是一舉解決了不同解析度和螢幕尺寸下view的適配問題,另外也簡化了旋轉時view的位置的定義 ,原來在底部之上10像素置中的view,不論在旋轉螢幕或是更換裝置(iPad或者iPhone5或者以後可能出現的mini iPad)的時候,始終還在底部之上10像素置中的位置,不會發生變化。 總結 使用約束條件來描述布局,view的frame會依據這些約束來進行計算 Describe the layout with constraints, and frames are calculated automatically.
AutoLayout和Autoresizing Mask的區別 Autoresizing Mask是我們的老朋友了…如果你以前一直是代碼寫UI的話,你肯定寫過UIViewAutoresizingFlexibleWidth之類的枚舉;如果你以前用IB比較多的話,一定注意到過每個view的size inspector中都有一個紅色線條的Autoresizing的指標和相應的動畫縮放的示意圖,這就是Autoresizing Mask。在iOS6之前,關於旋轉螢幕的適配和iPhone,iPad螢幕的自動適配,基本都是由Autoresizing Mask來完成的。但是隨著大家對iOS app的要求越來越高,以及已經以及今後可能出現的多種螢幕和解析度的裝置來說,Autoresizing Mask顯得有些落伍和遲鈍了。AutoLayout可以完成所有原來Autoresizing Mask能完成的工作,同時還能夠勝任一些原來無法完成的任務,其中包括: AutoLayout可以指定任意兩個view的相對位置,而不需要像Autoresizing Mask那樣需要兩個view在直系的view hierarchy中。 AutoLayout不必須指定相等關係的約束,它可以指定非相等約束(大於或者小於等);而Autoresizing Mask所能做的布局只能是相等條件的。 AutoLayout可以指定約束的優先順序,計算frame時將優先按照滿足優先順序高的條件進行計算。 總結 Autoresizing Mask是AutoLayout的子集,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成。AutoLayout還具備一些Autoresizing Mask不具備的優良特性,以協助我們更方便地構建介面。
AutoLayout基本使用方法
Interface Builder 這部分網上大量的教程,都是說的這個
手動使用API添加約束
建立 iOS6中新加入了一個類:NSLayoutConstraint,一個形如這樣的約束 item1.attribute = multiplier ? item2.attribute + constant 對應的代碼為
1 |
[NSLayoutConstraint constraintWithItem:button |
2 |
attribute:NSLayoutAttributeBottom |
3 |
relatedBy:NSLayoutRelationEqua |
5 |
attribute:NSLayoutAttributeBottom |
這對應的約束是“button的底部(y) = superview的底部 -10”。
添加 在建立約束之後,需要將其添加到作用的view上。UIView(當然NSView也一樣)加入了一個新的執行個體方法: -(void)addConstraint:(NSLayoutConstraint *)constraint; 用來將約束添加到view。在添加時唯一要注意的是添加的目標view要遵循以下規則: 對於兩個同層級view之間的約束關係,添加到他們的父view上