2009-07-25 42 views
43

何時以及如何使用layoutIfNeeded?我知道當我們改變視圖的佈局時,我們可以調用setNeedsLayout來更新佈局,但不知道何時應該使用layoutIfNeededlayoutIfNeeded如何使用?

注意:我有layoutIfNeeded在實際代碼中使用,但忘記了它在什麼情況下使用。

回答

57

layoutIfNeeded如果需要,強制接收器立即佈置其子視圖。

假設你已經覆蓋layoutSubviews,和UIKit認爲您的觀點需要什麼理由佈局(例如您在處理一些用戶操作時調用setNeedsLayout)。然後,您的自定義layoutSubviews方法將立即被調用,而不是通常在常規UIKit運行循環事件序列中(在事件處理之後,但在drawRect:之前)調用。

的,爲什麼你可能需要一個單一的運行循環中調用layoutIfNeeded一個例子:

  1. 您調整包含具有自定義佈局表視圖自定義視圖。 setNeedsLayout已設置,以便稍後調用layoutSubviews
  2. 控制器對象要求表視圖在處理用戶事件時滾動到某個特定的單元格。
  3. 您的自定義視圖對layoutSubviews中的表視圖執行一些自定義大小調整,以更改表視圖大小。

問題是,當控制器要求表視圖滾動(第2步)時,表視圖的界限已過時。更新後的邊界只能在後面的表格視圖中設置(步驟3)。在layoutSubviews完成後,控制器希望桌面視圖滾動到的位置可能實際上不可見。然後解決方案是控制器在知道可能發生的情況下調用layoutIfNeeded

-9

setNeedsLayout實際上調用了layoutIfNeeded,所以如果你的調用setNeedsDisplay沒有理由調用layoutIfNeeded。通過這種方式,setNeedsLayout是一種調用layoutIfNeeded的簡便方法,它可以完成繁重的工作。

+14

這是不正確的。 setNeedsLayout將標記佈局的視圖,這將導致layoutSubviews在另一個runloop循環中被調用。調用layoutIfNeeded將導致在相同的runloop循環中調用layoutSubviews。要測試這個,在layoutSubviews中設置一個斷點,然後在setNeedsLayout的調用中設置一個斷點。如果你前進一行,那麼你會注意到你沒有在layoutSubviews中打破。但是,如果您在layoutIfNeeded中突破並推進一行,您會注意到在推進之前您會在layoutSubviews中突破。 – tyler 2013-09-25 23:31:31