以下是iOS layout機(jī)制常用的相關(guān)方法:
*? layoutSubviews:對(duì)subviews重新布局,這個(gè)方法批糟,默認(rèn)沒(méi)有做任何事情格了,需要子類進(jìn)行重寫。該方法調(diào)用先于drawRect
*? layoutIfNeeded:方法如其名徽鼎,UIKit會(huì)判斷該receiver是否需要layout.根據(jù)Apple官方文檔,layoutIfNeeded遍歷的不是superview鏈盛末,應(yīng)該是subviews鏈
* setNeedsLayout:在receiver標(biāo)上一個(gè)需要被重新布局的標(biāo)記弹惦,在系統(tǒng)runloop的下一個(gè)周期自動(dòng)調(diào)用layoutSubviews
* setNeedsDisplay:標(biāo)記為需要重繪,異步調(diào)用drawRect悄但,即在receiver標(biāo)上一個(gè)需要被重新繪圖的標(biāo)記棠隐,在下一個(gè)draw周期自動(dòng)重繪,iphone device的刷新頻率是60hz檐嚣,也就是1/60秒后重繪
* setNeedsDisplayInRect:(CGRect)invalidRect:標(biāo)記為需要局部重繪
* drawRect:重寫此方法助泽,對(duì)receiver執(zhí)行重繪任務(wù),能獲得context
* sizeThatFits:傳入的參數(shù)是receiver當(dāng)前的size嚎京,返回一個(gè)適合的size
* sizeToFit:可以被手動(dòng)直接調(diào)用 嗡贺,不應(yīng)該在子類中被重寫,會(huì)自動(dòng)調(diào)用sizeThatFits方法鞍帝,應(yīng)該重寫sizeThatFits
【注】
(1)诫睬、sizeToFit和sizeThatFits方法都沒(méi)有遞歸,對(duì)subviews也不負(fù)責(zé)膜眠,只負(fù)責(zé)自己
(2)岩臣、如果要立即刷新,要先調(diào)用[view setNeedsLayout]宵膨,把標(biāo)記設(shè)為需要布局架谎,然后馬上調(diào)用[view layoutIfNeeded],實(shí)現(xiàn)布局
(3)辟躏、在視圖第一次顯示之前谷扣,標(biāo)記總是“需要刷新”的,可以直接調(diào)用[view layoutIfNeeded]
layoutSubviews在以下情況下被調(diào)用:
1捎琐、init初始化不會(huì)觸發(fā)layoutSubviews簇爆,但是用initWithFrame進(jìn)行初始化時(shí)您朽,當(dāng)rect的值不為CGRectZero時(shí),就會(huì)觸發(fā)layoutSubviews方法;
2想幻、當(dāng)調(diào)用addSubview會(huì)觸發(fā)layoutSubviews方法血筑;
3枚尼、設(shè)置view的frame值枉阵,且設(shè)置前后frame的值發(fā)生了變化;
4技掏、滾動(dòng)UIScrollView時(shí)铃将,會(huì)觸發(fā)layoutSubviews方法;
5哑梳、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews方法劲阎;
6、改變UIView大小的時(shí)候鸠真,也會(huì)觸發(fā)layoutSubviews方法悯仙;
【注】
(1)龄毡、setNeedsLayout方法: 標(biāo)記為需要重新布局,異步調(diào)用layoutIfNeeded刷新布局雁比,不立即刷新稚虎,但layoutSubviews一定會(huì)被調(diào)用
(2)撤嫩、layoutIfNeeded方法:如果有需要刷新的標(biāo)記偎捎,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒(méi)有標(biāo)記,不會(huì)調(diào)用layoutSubviews)