iOS-layoutSubviews

在UIView里面有一個(gè)方法layoutSubviews,這個(gè)方法定義如下

- (void)layoutSubviews; // override point. called by layoutIfNeeded automatically. As of iOS 6.0, when constraints-based layout is used the base implementation applies the constraints-based layout, otherwise it does nothing.

此方法官方解釋不可主動(dòng)調(diào)用

layoutSubviews作用:

layoutSubviews是對(duì)subviews重新布局。比如,我們想更新子視圖的位置的時(shí)候,可以通過(guò)調(diào)用layoutSubviews方法,即可以實(shí)現(xiàn)對(duì)子視圖重新布局。
layoutSubviews默認(rèn)是不做任何事情的,用到的時(shí)候,需要在子類進(jìn)行重寫。

layoutSubviews調(diào)用場(chǎng)景

①、直接調(diào)用setLayoutSubviews。
②、addSubview的時(shí)候觸發(fā)layoutSubviews。
③、當(dāng)view的frame發(fā)生改變的時(shí)候觸發(fā)layoutSubviews。
④、第一次滑動(dòng)UIScrollView的時(shí)候觸發(fā)layoutSubviews。
⑤、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件。
⑥、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件。
注意:
init初始化不會(huì)觸發(fā)layoutSubviews,但是使用initWithFrame進(jìn)行初始化時(shí),當(dāng)rect的值不為CGRectZero時(shí),也會(huì)觸發(fā)。

其他

①、- (void)layoutSubviews;
這個(gè)方法,默認(rèn)沒有做任何事情,需要子類進(jìn)行重寫;
②、- (void)setNeedsLayout;
標(biāo)記為需要重新布局,異步調(diào)用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定會(huì)被調(diào)用;
③、- (void)layoutIfNeeded;

如果,有需要刷新的標(biāo)記,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒有標(biāo)記,不會(huì)調(diào)用layoutSubviews)。
如果要立即刷新,要先調(diào)用[view setNeedsLayout],把標(biāo)記設(shè)為需要布局,然后馬上調(diào)用[view layoutIfNeeded],實(shí)現(xiàn)布局。在視圖第一次顯示之前,標(biāo)記總是“需要刷新”的,可以直接調(diào)用[view layoutIfNeeded]
④、reloadData會(huì)調(diào)用layoutSubviews方法嗎?
[cell setNeedsLayout]會(huì)調(diào)用cell的layoutSubviews

reloadData只是刷新列表而已

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容