天天看點

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

參考連結 

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 一般我都不勾

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法
AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

(2)

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法
AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

  • 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的圖

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法
AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

Relation 選項分别表示大于/等于/小于 指的是2個view之間的關系

Constant表示目前控件相對于SuperView的x/y的相對距離

Priority表示優先級 

在哪裡設定限制呢

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法
AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

或者是Editor--Pin

Interface Builder如何限制

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

一般來說隻要把自己的大小和位置相對固定了就不會有問題了

接下來說說一些例子

(1)UILabel UILabel會根據label.text的内容和字型自己算 如果numberOfLine = 1的話,label會自己去算長度。

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

是以隻需要2條限制即可

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

如果numberOfLine = 0的話,就看你自己要自适應寬度還是自适應高度。

其他的比如UIButton,UIView 都要限制到足夠固定這個控件的位置和大小

一些警告處理

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

修改了控件的位置或大小 你就可以通過這邊來更新限制或者更新frame

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

等到都限制好了可以先preview一下  每次運作真的好慢啊

AutoLayout---Interface BuilderAutoLayout是什麼?AutoLayout和Autoresizing Mask的差別AutoLayout基本使用方法

容易出現的錯誤

因為涉及限制問題,是以限制模型下的所有可能出現的問題這裡都會出現,具體來說包括兩種:

  • 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]

繼續閱讀