Masonry布局控件frame為0的問(wèn)題

Masonry 是對(duì) autolayout 的封裝,優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法和簡(jiǎn)潔易用的接口讓我們?cè)谧鯱I開(kāi)發(fā)時(shí)節(jié)省了不少時(shí)間。然而在初次使用它時(shí),由于還對(duì) autolayout 理解不夠深,就遇到了一些問(wèn)題,比如使用 Masonry 對(duì)控件添加約束后,并不會(huì)立即生效,frame 仍然是 0。如果此時(shí)我們需要這個(gè) frame,應(yīng)該怎么做呢?

使用 Masonry 添加約束后,如果有要設(shè)置 child 的形狀為圓形,就得知道它的 frame,像下面這樣寫肯定不會(huì)設(shè)置成功的:

因?yàn)檫@時(shí)候的 frame 還是 0。曾天真的想,會(huì)不會(huì)是因?yàn)?block 中的處理是在異步線程進(jìn)行的,不會(huì)等待 block 執(zhí)行完就已經(jīng)走到了下面使用frame的代碼,(一陣狂喜,好聰明。。。),所以馬上把代碼改寫:

然而并沒(méi)有什么卵用。

想不通的時(shí)候,就只能請(qǐng)教 goole 了,然后找到了 Masonry 約束下獲取 frame 的方法

masonry 本就是對(duì) autolayout 的封裝,使用 Masonry 就等于使用了蘋果的 autolayout。使用 masonry 布局完之后,系統(tǒng)會(huì)在某個(gè)時(shí)間點(diǎn)調(diào)用各個(gè) view 的?layoutSubViews?方法,從而更新各個(gè)控件的frame。遺憾的是,frame 的更新并不會(huì)在剛執(zhí)行完 Masonry 布局代碼時(shí)立即進(jìn)行,在布局代碼的下一行,你所獲取到的 frame 仍然是0。

想要在布局代碼結(jié)束就立即獲取當(dāng)前某個(gè)控件正確的 frame,需要調(diào)用layoutIfNeeded函數(shù)立即刷新布局,各個(gè)控件才會(huì)按照約束條件,生成當(dāng)前布局相應(yīng)的frame和bounds。而調(diào)用layoutIfNeeded的目的是讓系統(tǒng)調(diào)用layoutSubviews方法,我們也可以直接在這個(gè)方法里獲取frame,因?yàn)檫@時(shí)候開(kāi)始layout subviews,Masonry已經(jīng)計(jì)算出了真實(shí)的frame。

下面附上關(guān)于autolayout更新幾個(gè)方法的區(qū)別:

setNeedsLayout:標(biāo)記頁(yè)面需要更新,但是什么時(shí)候才會(huì)調(diào)用

layoutSubviews 去刷新布局,就不一定了。

layoutIfNeeded:告知頁(yè)面如果需要,就立刻更新布局。這里的“如果需要”什么意思呢?有什么條件嗎?是的,只有滿足如下某一個(gè)或幾個(gè)條件,調(diào)用 layoutIfNeeded 才會(huì)立即刷新frame:

有 addSubview 操作

設(shè)置了view的 frame,當(dāng)然前提是設(shè)置前后 frame 的值發(fā)生了變化

滾動(dòng)一個(gè)UIScrollView

旋轉(zhuǎn) Screen

改變一個(gè)UIView大小的時(shí)候

如果不滿足,就算是調(diào)用了 layoutIfNeeded 也不會(huì)立刻執(zhí)行 layoutSubViews 進(jìn)行 frame 更新。

如果我們想不管什么情況,都強(qiáng)制執(zhí)行 layoutSubViews 進(jìn)行 frame 更新怎么辦呢?那就是同時(shí)調(diào)用下面這兩個(gè)方法:

這樣必然會(huì)調(diào)用 layoutSubViews 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容