約束方式
只有iPhone4的時(shí)候,我們可以在代碼里將沒(méi)一個(gè)可視單元的位置寫死,這樣是沒(méi)問(wèn)題的,但隨著iPhone5、6的發(fā)布;布局情況就越來(lái)越微妙,蘋果也是持續(xù)在優(yōu)化整合更新約束布局方式。
Autoresizing屬性,僅能調(diào)整視圖變化相對(duì)于父類進(jìn)行適配,對(duì)于兄弟關(guān)系無(wú)法處理;
Autolayout iOS-6之后;
能夠讓我們對(duì)任一元素在屏幕下有著唯一的位置約束即絕對(duì)定位,嚴(yán)格意義是能夠唯一確定其位置約束、大小尺寸;VFL(Visual Format Language)方便書寫; Masonry
UIView (UIConstraintBasedCompatibility)
@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints
When you elect to position the view using auto layout by adding your own constraints, you must set this property to NO. IB will do this for you.
SizeClass iOS8中新增的,對(duì)應(yīng)xcode 6.0;擴(kuò)展了3*3種不同的組合界面,方便我們對(duì)不同尺寸布局在一個(gè)地方集中完成, 類似于 UIButton的不同狀態(tài)設(shè)置( Default、selected、highlight);
而xcode 8.0則刪除了 SizeClass,對(duì)應(yīng)iOS 10,取而代之的是 trait variations ,主要是進(jìn)行特征劃分和對(duì)應(yīng)設(shè)備的自定義布局;
UIStackView 也是相對(duì)于布局產(chǎn)生的UI控件,Stack View最有用的就是它會(huì)自動(dòng)為每個(gè)subview創(chuàng)建和添加Auto Layout constraints。當(dāng)然你可以控制subview的大小和位置??梢酝ㄟ^(guò)選項(xiàng)配置subview的大小、排布以及彼此間的間距。
調(diào)試
Symbolic Breakpoint: UIViewAlertForUnsatisfiableConstraints
- 打開斷點(diǎn)導(dǎo)航(cmd+7)
- 點(diǎn)擊左下角的+按鈕
- 選擇Add Symbolic Breakpoint
- 在Symbol添加UIViewAlertForUnsatisfiableConstraints; Action 添加__"po [[UIWindow keyWindow] autolayoutTrace]"或 "expr -l objc++ -O -- [[UIWindow keyWindow] autolayoutTrace]"(Swift) 或者LLDB 調(diào)試找到 AMBIGUOUS 點(diǎn)。
大家應(yīng)該都有碰到取到的視圖為1000*1000的。主要問(wèn)題是在View的 awakeFromNib,或者VC的viewDidLoad,獲取當(dāng)前視圖的frame或者bounds的size布局會(huì)導(dǎo)致界面異常。
解決方案:
- 全部用autolayout布局,不取frame或者bounds
- awakeFromNib,或者viewDidLoad要使用frame或者bounds前,先調(diào)用視圖的layoutIfNeeded。這個(gè)要注意,有發(fā)現(xiàn)viewDidLoad調(diào)用后,取到的frame的origin還是錯(cuò)誤的,不過(guò)size是對(duì)的.
- 在View的layoutSubviews或者VC的 viewDidLayoutSubviews再去獲取當(dāng)前視圖的frame或者bounds布局