iOS中自定義View實現layoutSubviews佈局子控制元件
iOS開發中,- (void)layoutSubviews{}方法及相關方法注意點!!
====
```objectivec
- (void)creatAutoLayoutUSE
{
// 一、layout相關方法
}
```
- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit
- (void)setNeedsDisplay
- (void)drawRect
1.layoutSubviews在以下情況下會被呼叫/被觸發??
----
+ 1、init初始化不會觸發layoutSubviews,但是是用initWithFrame 進行初始化時,當rect的值 非CGRectZero時,也會觸發。
+ 2、addSubview會觸發layoutSubviews
+ 3、設定view的Frame會觸發layoutSubviews,當然前提是frame的值設定前後發生了變化
+ 4、滾動一個UIScrollView會觸發layoutSubviews
+ 5、旋轉Screen會觸發父UIView上的layoutSubviews事件
+ 6、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件
####(在蘋果的官方文件中強調:####
You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 當我們在某個類的內部調整子檢視位置時,需要呼叫。反過來的意思就是說:如果你想要在外部設定subviews的位置,就不要重寫。)
2.重新整理子物件佈局??
----
####1.什麼時候,需要重寫??###
+ view是系統的,不需要重寫 - (void)layoutSubviews
+ view是自定義的,需要重寫 - (void)layoutSubviews
+ -layoutSubviews方法:這個方法,預設沒有做任何事情,需要子類進行重寫,自定義view時,手動重寫,這裡面只能寫subview的frame限制。
####2.手動呼叫這個方法,系統預設 我們不能手動直接呼叫這個方法,這能通過下列兩種方式,呼叫/觸發 - (void)layoutSubviews方法####
+ -setNeedsLayout方法: 標記為需要重新佈局,告訴系統未來某個時間點非同步呼叫。不立即重新整理,但layoutSubviews一定會被呼叫。
+ -layoutIfNeeded方法:如果,有需要重新整理的標記,立即呼叫layoutSubviews進行佈局(如果沒有標記,不會呼叫layoutSubviews)
+ 若需要立即重新整理view的frame更改:(同時呼叫,注意先後順序)
*先呼叫[view setNeedsLayout],把標記設為需要佈局
*然後馬上呼叫[view layoutIfNeeded],實現佈局
+ 在初始化方法init..。、或者view第一次顯示之前,標記總是“需要重新整理”的,可以直接呼叫[view layoutIfNeeded]
3.重繪
----
+ -drawRect:(CGRect)rect方法:重寫此方法,執行重繪任務
+ -setNeedsDisplay方法:標記為需要重繪,非同步呼叫drawRect
+ -setNeedsDisplayInRect:(CGRect)invalidRect方法:標記為需要區域性重繪
- (注意:sizeToFit會 自動呼叫sizeThatFits方法;
sizeToFit不應該在子類中被重寫,應該重寫sizeThatFits)
* sizeThatFits傳入的引數是receiver當前的size,返回一個適合的size
* sizeToFit可以被手動直接呼叫,注意(系統預設的一些控制元件可以通過呼叫sizeToFit方法使其有尺寸,egUIBarButtonItem,UITableView的組頭,組尾,表頭,表尾,,,......)
* sizeToFit和sizeThatFits方法都沒有遞迴,對subviews也不負責,只負責自己
* layoutSubviews對subviews重新佈局
* layoutSubviews方法呼叫先於drawRect
* setNeedsLayout在receiver標上一個需要被重新佈局的標記,在系統runloop的下一個週期自動呼叫layoutSubviews
* layoutIfNeeded方法如其名,UIKit會判斷該receiver是否需要layout.根據Apple官方文件,layoutIfNeeded方法應該是這樣的
* layoutIfNeeded遍歷的不是superview鏈,應該是subviews鏈
* drawRect是對receiver的重繪,能獲得context
* setNeedDisplay在receiver標上一個需要被重新繪圖的標記,在下一個draw週期自動重繪,iphone device的重新整理頻率是60hz,也就是1/60秒後重繪
文/hello_JSH(簡書作者)
原文連結:http://www.jianshu.com/p/ed28cbeae943
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。