從蘋果文檔,遞延佈局傳遞下,它說iOS的佈局傳遞和約束更新
「,而不是立即更新受影響的意見框架,自動佈局安排佈局通過在不久的將來。此延遲傳遞會更新佈局的約束,然後計算視圖層次結構中所有視圖的幀。'
什麼是真正令人費解的是,術語「不久的將來」。
功能setneedsLayout()
表示當您需要更新視圖及其所有子視圖時,需要更新週期的時間,但是爲什麼甚至在您甚至不知道更新週期何時會發生時調用此函數?我們不應該只使用layoutIfNeeded()
所有的時間,這樣我們就可以在我們的頭說,「對了,我想這個觀點被現在更新,所以我會用layoutIfNeeded()
。此外,有沒有比其他的任何layoutIfNeeded()
其他用途它UIView.animateWithDuration()
?
我已經讀了很多文章和理念還沒有真正堅持的是,謝謝你們
謝謝你的迴應,所以這意味着只要我在UIView上以編程方式改變一個約束(比如說當你點擊一個按鈕時發生改變),'setNeedsLayout()'和'layoutIfNeeded'都會被調用,視圖大小和位置會自動更新?但是當我們改變UIView的實際框架時,你需要調用'layoutIfNeeded()'來看看改變嗎?感謝 –
沒有,'setNeedsLayout()'會被調用,但** **你需要調用'layoutIfNeeded()'自己以應用'UIView'標記爲需要佈局的佈局。 'layoutIfNeeded()'是使屏幕發生變化的原因,您可以在動畫塊中使用動畫布局更改,或者像上面的示例中那樣調用它,它將立即設置佈局。方法名稱的「如果需要」部分是指''setNeedsLayout()'從未被調用的可能性,因爲可能沒有更新''UIView'',在這種情況下不需要佈局。 –
感謝您的快速響應,好的。但就你而言,我在一個項目上嘗試了這個,我基本上有一個UIButton和一個UILabel,當我點擊按鈕時,它改變了UILabel的一個約束。當我運行並構建它時,只要按下按鈕,UILabel就會在不調用'layoutIfNeeded()'的情況下切換**。遵循你的邏輯,UILabel不應該改變,因爲儘管調用了'setNeedsLayout()',但是沒有調用'layoutIfNeeded()',UILabel **的位置改變不應該發生** –