深刻理解代替單純記憶html
最開始(iOS 7)是NSLayoutConstraint
表示約束,直接加到視圖中生效ios
後來(iOS 9),因爲直接添加約束的API太冗長,因而出現了NSLayoutAnchor
的一套API安全
view1.topAnchor.constraint(equalTo: view2.centerYAnchor).isActive = true
複製代碼
同時出現了Top/Bottom Layout Guide
,爲的是解決在與root view of viewcontroller
佈局時,躲開頂部導航欄、狀態欄的問題(由於若是沒有這兩個guide,代碼中可能會出現一些magic number)bash
topLayoutGuide是UILayoutSupport
protocol類型app
length
用於framebu'justtopAnchor
、bottomAnchor
、length
用於autolayout佈局Auto Layout Guideiview
iOS 11及以後便
deprecated
了,取而代之的是更好用的safeArea
ide
一種在view、subviews之間起做用的相對佈局機制;能夠看做是不建議subview佈局的區域佈局
layoutMargins
和layoutMarginsGuide
兩個屬性(對應frame和autolayout兩種佈局方式)layoutMargins
表示的範圍layoutMarginsGuide
或在IB中選擇相對於margin佈局時,當父視圖的layoutMargins
發生改變時,子視圖位置會相對改變preservesSuperviewLayoutMargins
屬性爲true時(默認false),也會聯動變化。變化是,設置該屬性的view,在subview佈局時,會考慮view.superView所設置的layoutMargins,好比view.superView的layoutMargins設置的很大,以致於subview可能會佈局到view.superview不但願的地方,那開啓此屬性就會自動調整subview位置directionalLayoutMargins
,是layoutMargin
的升級版,layoutMaring
在水平方向只有left和right,但directionalLayoutMargins
使用了leading和trailing,支持雖不一樣閱讀方向的語言的環境下動態配置橫向marginPositioning Content Within Layout Marginsui
safeAreaLayoutGuide
用於autolayoutsafeAreaInsets
用於frame佈局additionalSafeAreaInsets
來擴展safeareaPositioning Content Relative to the Safe Areaspa
截止到目前(寫文章時最新的iOS系統是13版本)
safearea的產生並非用來取代layoutMargin的,從layoutMargin並無被廢棄可以看出,這兩套機制均可以正常的work
layoutMargin能夠被修改,safeArea不能夠
二者的惟一聯繫是,insetsLayoutMarginsFromSafeArea
當爲true時,且layoutMargin在safearea範圍之外時,layoutMargin會自動調整爲safeArea的大小
Layout Guide, Margins, Insets and Safe Area demystified on iOS 10 & 11