關(guān)于系統(tǒng)自動(dòng)調(diào)用的iOS layout的相關(guān)方法:
1.layoutSubviews 關(guān)于frame 改動(dòng)會(huì)調(diào)用
2.layoutIfNeeded layoutIfNeeded()立即調(diào)用layoutSubviews進(jìn)行布局
3.setNeedsLayout 標(biāo)記需要重新布局眯分,如果有l(wèi)ayoutIfNeeded 會(huì)立即刷新
4.setNeedsDisplay 有需要刷新的標(biāo)記,立即調(diào)用5.layoutSubviews進(jìn)行布局
6.drawRect loadview viewdidload 后調(diào)用 重新布局會(huì)調(diào)用
7.sizeToFit sizeToFit會(huì)自動(dòng)調(diào)用sizeThatFits方法
layoutSubviews
這個(gè)方法柒桑,默認(rèn)沒(méi)有做任何事情弊决,需要子類進(jìn)行重寫 。 系統(tǒng)在很多時(shí)候會(huì)去調(diào)用這個(gè)方法:
1.初始化不會(huì)觸發(fā)layoutSubviews魁淳,但是如果設(shè)置了不為CGRectZero的frame的時(shí)候就會(huì)觸發(fā)飘诗。
2.addSubview會(huì)觸發(fā)layoutSubviews
3.設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化
4.滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews
5.旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件
6.改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件
setNeedsLayout
配合layoutIfNeeded立即更新
layoutIfNeeded
如果,有需要刷新的標(biāo)記息拜,立即調(diào)用layoutSubviews進(jìn)行布局
drawRect
drawRect在以下情況下會(huì)被調(diào)用:
1溉潭、如果在UIView初始化時(shí)沒(méi)有設(shè)置rect大小,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用少欺。drawRect調(diào)用是在Controller->loadView, Controller->viewDidLoad 兩方法之后掉用的.所以不用擔(dān)心在控制器中,這些View的drawRect就開(kāi)始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View draw的時(shí)候需要用到某些變量值).
2岛抄、該方法在調(diào)用sizeToFit后被調(diào)用,所以可以先調(diào)用sizeToFit計(jì)算出size狈茉。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法夫椭。3、通過(guò)設(shè)置contentMode屬性值為UIViewContentModeRedraw氯庆。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:蹭秋。4扰付、直接調(diào)用setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:仁讨,但是有個(gè)前提條件是rect不能為0羽莺。以上1,2推薦;而3,4不提倡
sizeToFit
sizeToFit會(huì)自動(dòng)調(diào)用sizeThatFits方法洞豁;
sizeToFit不應(yīng)該在子類中被重寫盐固,應(yīng)該重寫sizeThatFits
sizeThatFits傳入的參數(shù)是receiver當(dāng)前的size,返回一個(gè)適合的size
sizeToFit可以被手動(dòng)直接調(diào)用sizeToFit和sizeThatFits方法都沒(méi)有遞歸丈挟,對(duì)subviews也不負(fù)責(zé)刁卜,只負(fù)責(zé)自己