2017-08-07 160 views
0

從蘋果文檔,遞延佈局傳遞下,它說iOS的佈局傳遞和約束更新

「,而不是立即更新受影響的意見框架,自動佈局安排佈局通過在不久的將來。此延遲傳遞會更新佈局的約束,然後計算視圖層次結構中所有視圖的幀。'

什麼是真正令人費解的是,術語「不久的將來」。

功能setneedsLayout()表示當您需要更新視圖及其所有子視圖時,需要更新週期的時間,但是爲什麼甚至在您甚至不知道更新週期何時會發生時調用此函數?我們不應該只使用layoutIfNeeded()所有的時間,這樣我們就可以在我們的頭說,「對了,我想這個觀點被現在更新,所以我會用layoutIfNeeded()。此外,有沒有比其他的任何layoutIfNeeded()其他用途它UIView.animateWithDuration()

我已經讀了很多文章和理念還沒有真正堅持的是,謝謝你們

回答

0

你並不需要直接調用setNeedsLayout()的大部分時間。當你做出改變的UIView它會自動電話setNeedsLayout。當你在自動佈局更新限制它會發送推遲通過消息到受影響的UIView s,它需要他們需要佈局以及。這將標記視圖需要佈置它的子視圖。您可以通過調用layoutIfNeeded()函數在特定時間佈局視圖。這將根據需要執行和佈置子視圖。

至於你問,還有更多的用途來叫layoutIfNeeded()功能,而不調用它的動畫塊內。

舉個簡單的例子,也許你不希望在所有使用動畫,只想佈局你的約束。

subview.frame = CGRect(x: 100, y: 100, width: 50, height: 50) 
// Above makes change to the view. 'setNeedsLayout()' has been called 

// Below will layout immediately 
view.layoutIfNeeded() 

要回答你關於「近期未來」部分的問題,我並不完全確定。一個受過教育的猜測是,因爲佈局變化中所有受影響的UIView必須在特定時間被通知佈局,這意味着他們也將需要計算他們的新幀。根據調用setNeedsLayout()函數的數量UIView,可能會涉及一些重要的處理時間。這也許就是他們在「不遠的將來」所說的原因。

+0

謝謝你的迴應,所以這意味着只要我在UIView上以編程方式改變一個約束(比如說當你點擊一個按鈕時發生改變),'setNeedsLayout()'和'layoutIfNeeded'都會被調用,視圖大小和位置會自動更新?但是當我們改變UIView的實際框架時,你需要調用'layoutIfNeeded()'來看看改變嗎?感謝 –

+0

沒有,'setNeedsLayout()'會被調用,但** **你需要調用'layoutIfNeeded()'自己以應用'UIView'標記爲需要佈局的佈局。 'layoutIfNeeded()'是使屏幕發生變化的原因,您可以在動畫塊中使用動畫布局更改,或者像上面的示例中那樣調用它,它將立即設置佈局。方法名稱的「如果需要」部分是指''setNeedsLayout()'從未被調用的可能性,因爲可能沒有更新''UIView'',在這種情況下不需要佈局。 –

+0

感謝您的快速響應,好的。但就你而言,我在一個項目上嘗試了這個,我基本上有一個UIButton和一個UILabel,當我點擊按鈕時,它改變了UILabel的一個約束。當我運行並構建它時,只要按下按鈕,UILabel就會在不調用'layoutIfNeeded()'的情況下切換**。遵循你的邏輯,UILabel不應該改變,因爲儘管調用了'setNeedsLayout()',但是沒有調用'layoutIfNeeded()',UILabel **的位置改變不應該發生** –