iOS中AutoLayer自动布局流程及相关方法
關(guān)于UIView的Layer,IOS提供了三個方法:
1、layoutSubviews
系統(tǒng)重寫布局:在iOS5.1和之前的版本,此方法的缺省實(shí)現(xiàn)不會做任何事情(實(shí)現(xiàn)為空),iOS5.1之后(iOS6開始)的版本,此方法的缺省實(shí)現(xiàn)是使用你設(shè)置在此view上面的constraints(Autolayout)去決定subviews的position和size。 UIView的子類如果需要對其subviews進(jìn)行更精確的布局,則可以重寫此方法。只有在autoresizing和constraint-based behaviors of subviews不能提供我們想要的布局結(jié)果的時候,我們才應(yīng)該重寫此方法。可以在此方法中直接設(shè)置subviews的frame。 我們不應(yīng)該直接調(diào)用此方法,而應(yīng)當(dāng)用下面兩個方法。
2、setNeedsLayout
此方法會將view當(dāng)前的layout設(shè)置為無效的,并在下一個upadte cycle里去觸發(fā)layout更新。也就是說, ?告知頁面需要更新,但是不會立刻開始更新。執(zhí)行后會立刻調(diào)用layoutSubviews。
3、layoutIfNeeded
告知頁面布局立刻更新, 它會強(qiáng)制立即進(jìn)行l(wèi)ayout, 從當(dāng)前view開始,此方法會遍歷整個view層次(包括superviews)請求layout。因此,調(diào)用此方法會強(qiáng)制整個view層次布局。。所以一般都會和setNeedsLayout一起使用。如果希望立刻生成新的frame需要調(diào)用此方法,利用這點(diǎn)一般布局動畫可以在更新布局后直接使用這個方法讓動畫生效。
setNeedsDisplay
?
?
基于約束的AutoLayer的方法:
1、setNeedsUpdateConstraints
當(dāng)一個自定義view的某個屬性發(fā)生改變,并且可能影響到constraint時,需要調(diào)用此方法去標(biāo)記constraints需要在未來的某個點(diǎn)更新,系統(tǒng)然后調(diào)用updateConstraints.
2、needsUpdateConstraints
constraint-based layout system使用此返回值去決定是否需要調(diào)用updateConstraints作為正常布局過程的一部分。
3、updateConstraintsIfNeeded
立即觸發(fā)約束更新,自動更新布局。
4、updateConstraints
?自定義view應(yīng)該重寫此方法在其中建立constraints. 注意:要在實(shí)現(xiàn)在最后調(diào)用[super updateConstraints]
?
Auto?Layout Process 自動布局過程
與使用springs and struts(autoresizingMask)比較,Auto layout在view顯示之前,多引入了兩個步驟:updating constraints 和laying out views。每一個步驟都依賴于上一個。display依賴layout,而layout依賴updating constraints。?updating constraints->layout->display
第一步:updating constraints,被稱為測量階段,其從下向上(from subview to super view),為下一步layout準(zhǔn)備信息。可以通過調(diào)用方法setNeedUpdateConstraints去觸發(fā)此步。constraints的改變也會自動的觸發(fā)此步。但是,當(dāng)你自定義view的時候,如果一些改變可能會影響到布局的時候,通常需要自己去通知Auto layout,updateConstraintsIfNeeded。
自定義view的話,通常可以重寫updateConstraints方法,在其中可以添加view需要的局部的contraints。
第二步:layout,其從上向下(from super view to subview),此步主要應(yīng)用上一步的信息去設(shè)置view的center和bounds。可以通過調(diào)用setNeedsLayout去觸發(fā)此步驟,此方法不會立即應(yīng)用layout。如果想要系統(tǒng)立即的更新layout,可以調(diào)用layoutIfNeeded。另外,自定義view可以重寫方法layoutSubViews來在layout的工程中得到更多的定制化效果。
第三步:display,此步時把view渲染到屏幕上,它與你是否使用Auto layout無關(guān),其操作是從上向下(from super view to subview),通過調(diào)用setNeedsDisplay觸發(fā),
因?yàn)槊恳徊蕉家蕾嚽耙徊?#xff0c;因此一個display可能會觸發(fā)layout,當(dāng)有任何layout沒有被處理的時候,同理,layout可能會觸發(fā)updating constraints,當(dāng)constraint system更新改變的時候。
需要注意的是,這三步不是單向的,constraint-based layout是一個迭代的過程,layout過程中,可能去改變constraints,有一次觸發(fā)updating constraints,進(jìn)行一輪layout過程。
注意:如果你每一次調(diào)用自定義layoutSubviews都會導(dǎo)致另一個布局傳遞,那么你將會陷入一個無限循環(huán)中。?
如下圖:
轉(zhuǎn)載于:https://www.cnblogs.com/bigshow1949/p/6340784.html
總結(jié)
以上是生活随笔為你收集整理的iOS中AutoLayer自动布局流程及相关方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福建工程学院寒假作业G题
- 下一篇: 对clear float 的理解