1. 程式人生 > >iOS中自定義View實現layoutSubviews佈局子控制元件

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
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。