在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只是刷新列表而已