我在界面生成器中有一個默認值和一個緊湊寬度值的約束。我有這個約束鏈接到一個IBOutlet,所以我可以在運行時在代碼中獲取常量值。如果我在iPhone 4S模擬器上運行,則在viewDidLoad
中,常量是默認值。 willTransitionToTraitCollection
或viewWillTransitionToSize
都不會被調用,但是在某些時候約束被更新爲緊湊值,因爲後面的約束是正確的。約束在哪裏被UIViewController
更新?這不是updateViewConstraints
。更新尺寸類別的約束在哪裏?
更新:建議viewDidLayoutSubviews
和traitCollectionDidChange
方法不是在不斷變化之一:
override func viewDidLayoutSubviews() {
println("Before viewDidLayoutSubviews: \(self.navControllerBottomSpaceConstraint.constant)")
super.viewDidLayoutSubviews()
println("After viewDidLayoutSubviews: \(self.navControllerBottomSpaceConstraint.constant)")
}
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
println("Before traitCollectionDidChange: \(self.navControllerBottomSpaceConstraint.constant)")
super.traitCollectionDidChange(previousTraitCollection)
println("After traitCollectionDidChange: \(self.navControllerBottomSpaceConstraint.constant)")
}
輸出:
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before traitCollectionDidChange: 20.0
After traitCollectionDidChange: 20.0
Before viewDidLayoutSubviews: 0.0
After viewDidLayoutSubviews: 0.0
Before viewDidLayoutSubviews: 0.0
After viewDidLayoutSubviews: 0.0
你究竟需要什麼?應對變化還是趕上變化的時刻? –
我需要知道什麼是價值,所以我可以圍繞它設置我的UI。我需要做一些圖像處理,所以不能在viewDidLayoutSubviews中多次執行。當約束達到最終值時,我需要知道一次。 – Nick
好吧,在'viewDidAppear'之後出現的第一個'viewDidLayoutSubviews'是初始佈局完成的地方。你不在'viewDidLoad'中追蹤它,因爲視圖沒有正確對齊。我建議你設置一個布爾,該視圖出現並在'viewDidLayoutSubviews'中檢查一次這個布爾值+記住約束值。之後,您可以比較它的價值以反映任何UI更改。 –