參考連結
http://blog.csdn.net/meegomeego/article/details/39991057
http://blog.csdn.net/yongyinmg/article/details/39315821
http://www.onevcat.com/2012/09/autoayout/
http://blog.csdn.net/mozixiong/article/details/14165391
http://constraints.icodeforlove.com/
AutoLayout是什麼?
AutoLayout是一種基于限制的,描述性的布局系統。 Auto Layout Is a Constraint-Based, Descriptive Layout System.
AutoLayout和Autoresizing Mask的差別
Autoresizing Mask是AutoLayout的子集,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成。AutoLayout還具備一些Autoresizing Mask不具備的優良特性,以幫助我們更友善地建構界面。
AutoLayout基本使用方法
Interface Builder
先介紹一點基本設定:
(1)如果不是iphone和ipad一起做的話 use Size classes 一般我都不勾
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TTq1Eez1WZ040MkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DMwUjNzQjM2EDNwEDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(2)
- Content Hugging Priority(内容壓縮優先級)
- Content Compression Resistance Priority(内容抗壓縮優先級)。
static constUILayoutPriority UILayoutPriorityRequired
static constUILayoutPriority UILayoutPriorityDefaultHigh
static constUILayoutPriority UILayoutPriorityDefaultLow
static constUILayoutPriority UILayoutPriorityFittingSizeLevel
Greater/Less 一般與 Priority 一起使用,為一個 Constraint 設定了 Greater/Less 後,調整 Priority。如果 Constraint 的 Priority 的值越大,程式優先設定它的 Constraint 效果。
如果 Constraint 發生沖突時,會先找優先級高的UIView,滿足優先級高的UIView 的Constraint 後再依次找優先級低的 Constraint 滿足,最後改變 View 的 Frame。如果發生多個 Constraint不能同時滿足的情況,就發生了Unsatisfiable Constraints的錯誤。
UIView中關于Content Hugging 和 Content Compression Resistance的方法有:
- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis
- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis
intrinsicContentSize
通俗的講,具有intrinsic content size的控件自己知道(可以計算)自己的大小,例如一個label,當你設定text,font之後,其大小是可以計算到的。關于intrinsic content size官方的解釋:
Custom views typically have content that they display of which the layout system is unaware. Overriding this method allows a custom view to communicate to the layout system what size it would like to be based on its content. This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height, for example.
截個constrait的圖
Relation 選項分别表示大于/等于/小于 指的是2個view之間的關系
Constant表示目前控件相對于SuperView的x/y的相對距離
Priority表示優先級
在哪裡設定限制呢
或者是Editor--Pin
Interface Builder如何限制
一般來說隻要把自己的大小和位置相對固定了就不會有問題了
接下來說說一些例子
(1)UILabel UILabel會根據label.text的内容和字型自己算 如果numberOfLine = 1的話,label會自己去算長度。
是以隻需要2條限制即可
如果numberOfLine = 0的話,就看你自己要自适應寬度還是自适應高度。
其他的比如UIButton,UIView 都要限制到足夠固定這個控件的位置和大小
一些警告處理
修改了控件的位置或大小 你就可以通過這邊來更新限制或者更新frame
等到都限制好了可以先preview一下 每次運作真的好慢啊
容易出現的錯誤
因為涉及限制問題,是以限制模型下的所有可能出現的問題這裡都會出現,具體來說包括兩種:
- Ambiguous Layout 布局不能确定
- Unsatisfiable Constraints 無法滿足限制
布局不能确定指的是給出的限制條件無法唯一确定一種布局,也即限制條件不足,無法得到唯一的布局結果。這種情況一般添加一些必要的限制或者調整優先級可以解決。無法滿足限制的問題來源是有限制條件互相沖突,是以無法同時滿足,需要删掉一些限制。兩種錯誤在出現時均會導緻布局的不穩定和錯誤,Ambiguous可以被容忍并且選擇一種可行布局呈現在UI上,Unsatisfiable的話會無法得到UI布局并報錯。
對于不能确定的布局,可以通過調試時暫停程式,在debugger中輸入
- po [[UIWindow keyWindow] _autolayoutTrace]
來檢查是否存在Ambiguous Layout以及存在的位置,來幫助添加條件。另外還有一些檢查方法,來檢視view的限制和限制狀态:
- [view constraintsAffectingLayoutForOrientation/Axis: NSLayoutConstraintOrientationHorizontal/Vertical]
- [view hasAmbiguousLayout]
- [view exerciseAmbiguityInLayout]