約束布局之旅—1

約束方式

只有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

  1. 打開斷點(diǎn)導(dǎo)航(cmd+7)
  2. 點(diǎn)擊左下角的+按鈕
  3. 選擇Add Symbolic Breakpoint
  4. 在Symbol添加UIViewAlertForUnsatisfiableConstraints; Action 添加__"po [[UIWindow keyWindow] autolayoutTrace]"或 "expr -l objc++ -O -- [[UIWindow keyWindow] autolayoutTrace]"(Swift) 或者LLDB 調(diào)試找到 AMBIGUOUS 點(diǎn)。

iOS10 約束問(wèn)題

大家應(yīng)該都有碰到取到的視圖為1000*1000的。主要問(wèn)題是在View的 awakeFromNib,或者VC的viewDidLoad,獲取當(dāng)前視圖的frame或者bounds的size布局會(huì)導(dǎo)致界面異常。

解決方案:

  1. 全部用autolayout布局,不取frame或者bounds
  2. awakeFromNib,或者viewDidLoad要使用frame或者bounds前,先調(diào)用視圖的layoutIfNeeded。這個(gè)要注意,有發(fā)現(xiàn)viewDidLoad調(diào)用后,取到的frame的origin還是錯(cuò)誤的,不過(guò)size是對(duì)的.
  3. 在View的layoutSubviews或者VC的 viewDidLayoutSubviews再去獲取當(dāng)前視圖的frame或者bounds布局
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容