前言
本文為WWDC2015的Session 218 "Mysteries of Auto Layout Part 1"視頻筆記,視頻主要內(nèi)容為UIStackView和Autolayout組件兩大部分.在看這個Session的過程中,發(fā)現(xiàn)有些不少值得關(guān)注的地方,因此記錄下來,等內(nèi)容進(jìn)一步的完善.
內(nèi)容
Mystery#1 StackView
1.基于Autolayout的最高一層封裝,
2.支持iOS和OSX平臺(主要還是關(guān)注下iOS)
3.它能幫你管理子視圖的約束.
4.重要屬性
- axis 決定子視圖的排布方式:水平還是垂直
- horizontal
- vertical
alignment 設(shè)置子視圖在StackView的對齊方式
top
center
bottom
baseline
firstBaseline
lastBaseline
fill
Leading
Trailing
distrubute 允許設(shè)置靈活的分布
Fill
FillEqually : 等間距并且相同Size的填充
FillProportionally : 基于
intrinsic content size
的填充EqualSpacing
EqualCentering
5.選擇UIStackView的快捷方式: Control+Shift+右擊
選擇UIStackView
6.快捷添加約束: 選擇視圖并Control-drag
到指定視圖.
7.所有加入同一個StackView的視圖都默認(rèn)擁有相同的Priorites(content-hugging,compression-resistance),其子視圖出現(xiàn)拉升或收縮時需要自定義修改優(yōu)先級.
8.在設(shè)置StackView下的視圖的Hiden,只是界面上的隱藏,仍然為被StackView持有.
9.支持UIView動畫,由于基于Autolayout的封裝,其動畫屬性: hidden, space, axis, alignment, distrubute...
10.利用arrangedSubviews
獲取StackView所有擁有的視圖子集,判斷指定視圖為否被裝入StackView.
11.StackView不需要后臺渲染,純粹的布局,輕量級.備注:內(nèi)部存在不渲染的特殊Transform 層.
Mystery#2 Constraints
- 改變視圖的約束使用
active/deactivate
進(jìn)行約束改變,不再使用add/remove
.類方法,不需要持有視圖而管理約束,約束自己找到所屬的視圖. - 不能試圖將某一視圖的所有約束
deactivate
,極有可能內(nèi)部的約束與其他視圖存在聯(lián)系,進(jìn)而破壞約束平衡. - 保持對于以后改變的指定約束或者約束集合的強(qiáng)引用,用來指定時機(jī)的
active
.
Mystery#3 Size
- 許多系統(tǒng)控件視圖存在
intrinsic content size
,比如UIButton,Label,imageView,UISlide... Autolayout引擎會自動對應(yīng)intrinsic content size
創(chuàng)建內(nèi)部的約束. - 想要自定義內(nèi)容尺寸重寫
intrinsicContentSize
方法, 針對以下兩種情況
- 無法從約束獲取需要的尺寸信息
- 繪制自定義視圖
- 重寫內(nèi)容尺寸后需要手動禁止影響內(nèi)部尺寸改變的因素.
- 利用size與其他視圖size建立關(guān)系,完善約束.
Mystery#4 Priority
- 系統(tǒng)有三個默認(rèn)值允許設(shè)置: 1000(require), 750(high), 250(low)
- 比較策略: 優(yōu)先級大的執(zhí)行其約束
- 系統(tǒng)視圖尺寸內(nèi)部也存在默認(rèn)的約束優(yōu)先級: iOS上50;OSX上490,500,510
- 注意自定義的約束優(yōu)先級與系統(tǒng)內(nèi)部的競爭
- 視圖間相同的優(yōu)先級會造成約束沖突;
- hug:防止拉伸超過自己的
intrinsic content size
; compression-resistance:防止壓縮小于自己的intrinsic content size
.
Mystery5 Alignment
- 針對視圖間相關(guān)位置排列,水平/垂直居中.
- 針對文字內(nèi)容視圖,有baseline,firstBaselin,lastBaseline對齊方式,適用于文字動態(tài)高度變化時的視圖位置設(shè)定.
- leading/trailing 針對國際化語言的優(yōu)化,使用從左到右的語言會構(gòu)建從左到右的約束,反之相反.
- 如果使用了left/right 約束對齊,不能與 leading/trailing混淆使用,否則會有約束警告產(chǎn)生.
-
alignment rects
通常(不絕對)為視圖的frame,可以針對主要內(nèi)容區(qū)域進(jìn)行對齊,剔除細(xì)微的邊界元素,不會改變視圖的transform. - 想要改變alignment rects的指定區(qū)域需要重寫
aligmentRectInsets
方法,但意味著將自己處理對齊區(qū)域,系統(tǒng)不在計算.
結(jié)尾
通過這個session,看到了Stack View強(qiáng)大的布局能力,其簡單易用的API,讓內(nèi)容布局變得更加便捷和靈活也顯示著Autolayout技術(shù)的完善和進(jìn)步.后半部分對Autolayout引擎如何工作也說了全面的說明,使得對Autolayout技術(shù)的理解