iOS開發(fā)中,- (void)layoutSubviews{}方法及相關(guān)方法注意點(diǎn)!!
```objectivec
- (void)creatAutoLayoutUSE
{
// 一、layout相關(guān)方法
}```
- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit
- (void)setNeedsDisplay
- (void)drawRect
1.layoutSubviews在以下情況下會(huì)被調(diào)用/被觸發(fā)?桩卵?
----
+ 1、init初始化不會(huì)觸發(fā)layoutSubviews倍宾,但是是用initWithFrame 進(jìn)行初始化時(shí)雏节,當(dāng)rect的值 非CGRectZero時(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事件
####(在蘋果的官方文檔中強(qiáng)調(diào):####
You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 當(dāng)我們?cè)谀硞€(gè)類的內(nèi)部調(diào)整子視圖位置時(shí)埃元,需要調(diào)用涝涤。反過來的意思就是說:如果你想要在外部設(shè)置subviews的位置,就不要重寫岛杀。)
2.刷新子對(duì)象布局??
----
####1.什么時(shí)候阔拳,需要重寫?类嗤?###
+ view是系統(tǒng)的糊肠,不需要重寫 - (void)layoutSubviews
+ view是自定義的裳瘪,需要重寫? - (void)layoutSubviews
+ -layoutSubviews方法:這個(gè)方法,默認(rèn)沒有做任何事情罪针,需要子類進(jìn)行重寫,自定義view時(shí)黄伊,手動(dòng)重寫泪酱,這里面只能寫subview的frame限制。
####2.手動(dòng)調(diào)用這個(gè)方法还最,系統(tǒng)默認(rèn) 我們不能手動(dòng)直接調(diào)用這個(gè)方法墓阀,這能通過下列兩種方式,調(diào)用/觸發(fā) - (void)layoutSubviews方法####
+ -setNeedsLayout方法: 標(biāo)記為需要重新布局拓轻,告訴系統(tǒng)未來某個(gè)時(shí)間點(diǎn)異步調(diào)用斯撮。不立即刷新,但layoutSubviews一定會(huì)被調(diào)用扶叉。
+ -layoutIfNeeded方法:如果勿锅,有需要刷新的標(biāo)記,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒有標(biāo)記枣氧,不會(huì)調(diào)用layoutSubviews)
+ 若需要立即刷新view的frame更改:(同時(shí)調(diào)用溢十,注意先后順序)
*先調(diào)用[view setNeedsLayout],把標(biāo)記設(shè)為需要布局
*然后馬上調(diào)用[view layoutIfNeeded]达吞,實(shí)現(xiàn)布局
+ 在初始化方法init..张弛。、或者view第一次顯示之前酪劫,標(biāo)記總是“需要刷新”的吞鸭,可以直接調(diào)用[view layoutIfNeeded]
3.重繪
----
+ -drawRect:(CGRect)rect方法:重寫此方法,執(zhí)行重繪任務(wù)
+ -setNeedsDisplay方法:標(biāo)記為需要重繪覆糟,異步調(diào)用drawRect
+ -setNeedsDisplayInRect:(CGRect)invalidRect方法:標(biāo)記為需要局部重繪
- (注意: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)用,注意(系統(tǒng)默認(rèn)的一些控件可以通過調(diào)用sizeToFit方法使其有尺寸,egUIBarButtonItem,UITableView的組頭,組尾,表頭,表尾,,,......)
* sizeToFit和sizeThatFits方法都沒有遞歸透敌,對(duì)subviews也不負(fù)責(zé),只負(fù)責(zé)自己
* layoutSubviews對(duì)subviews重新布局
* layoutSubviews方法調(diào)用先于drawRect
* setNeedsLayout在receiver標(biāo)上一個(gè)需要被重新布局的標(biāo)記踢械,在系統(tǒng)runloop的下一個(gè)周期自動(dòng)調(diào)用layoutSubviews
* layoutIfNeeded方法如其名酗电,UIKit會(huì)判斷該receiver是否需要layout.根據(jù)Apple官方文檔,layoutIfNeeded方法應(yīng)該是這樣的
* layoutIfNeeded遍歷的不是superview鏈,應(yīng)該是subviews鏈
* drawRect是對(duì)receiver的重繪内列,能獲得context
* setNeedDisplay在receiver標(biāo)上一個(gè)需要被重新繪圖的標(biāo)記撵术,在下一個(gè)draw周期自動(dòng)重繪,iphone device的刷新頻率是60hz话瞧,也就是1/60秒后重繪
```objectivec