2015-06-04 93 views
1

我在界面生成器中有一個默認值和一個緊湊寬度值的約束。我有這個約束鏈接到一個IBOutlet,所以我可以在運行時在代碼中獲取常量值。如果我在iPhone 4S模擬器上運行,則在viewDidLoad中,常量是默認值。 willTransitionToTraitCollectionviewWillTransitionToSize都不會被調用,但是在某些時候約束被更新爲緊湊值,因爲後面的約束是正確的。約束在哪裏被UIViewController更新?這不是updateViewConstraints更新尺寸類別的約束在哪裏?

更新:建議viewDidLayoutSubviewstraitCollectionDidChange方法不是在不斷變化之一:

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 
+0

你究竟需要什麼?應對變化還是趕上變化的時刻? –

+0

我需要知道什麼是價值,所以我可以圍繞它設置我的UI。我需要做一些圖像處理,所以不能在viewDidLayoutSubviews中多次執行。當約束達到最終值時,我需要知道一次。 – Nick

+0

好吧,在'viewDidAppear'之後出現的第一個'viewDidLayoutSubviews'是初始佈局完成的地方。你不在'viewDidLoad'中追蹤它,因爲視圖沒有正確對齊。我建議你設置一個布爾,該視圖出現並在'viewDidLayoutSubviews'中檢查一次這個布爾值+記住約束值。之後,您可以比較它的價值以反映任何UI更改。 –

回答

1

感謝Matt和Sega-Zero爲我指出了正確的方向。

答案是在視圖的第一個layoutSubviews進入視圖層次結構後更新約束。所以在你的視圖控制器中,你可以這樣做:

override func viewDidLayoutSubviews() { 
    if self.propertyCalculatedFromConstraints == nil && self.view.window != nil { 
     // constraints and sizes are now valid 
     self.propertyCalculatedFromConstraints = self.constraint.constant 
    } 
    super.viewDidLayoutSubviews() 
} 

override func viewDidDisappear() { 
    self.propertyCalculatedFromConstraints = nil 
    super.viewDidDisappear() 
} 
0

traitCollectionDidChange:在這裏你可以捕捉大小類別更改或viewDidLayoutSubviews的地方的父視圖是您可以檢測到任何自動佈局更改的地方

+0

這兩種方法都沒有改變,請參閱我更新的問題。謝謝 – Nick