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