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)槊恳徊蕉家蕾嚽耙徊竭耗悖虼艘粋€(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)中饶氏。
交流群
移動(dòng)開發(fā)交流群:264706196