2015-11-08 98 views
0

旋轉某些視圖時的風景,我得到這個日誌時:確定的約束越來越「無法同時滿足的約束」

無法同時滿足的約束。 以下列表中的至少一個約束可能是您不想要的。試試這個:(1)看看每個約束,並試圖找出你不期望的; (2)找到添加不需要的約束或約束並修復它的代碼。 (注意:如果你看到,你不明白NSAutoresizingMaskLayoutConstraints,請參閱文檔UIView的財產translatesAutoresizingMaskIntoConstraints)

(
"<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]>", 
"<NSLayoutConstraint:0x17009b580 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(82)-[UILabel:0x14c51ed20'Welcome to...']>", 
"<NSLayoutConstraint:0x17009b2b0 V:[UILabel:0x14c51ed20'Welcome to...']-(30)-[UIView:0x14c51e7e0]>", 
"<NSLayoutConstraint:0x170280230 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(0)-[UIView:0x14c51e7e0]>" 

將嘗試打破約束

恢復
<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]> 

在UIViewAlertForUnsatisfiableConstraints中創建一個符號斷點以在調試器中捕獲此斷點。 列出的UIView上的UIConstraintBasedLayoutDebugging類中的方法也可能有所幫助。

而我什麼都不懂。我添加了象徵性的UIViewAlertForUnsatisfiableConstraints斷點,但內存地址告訴我什麼都沒有......我怎樣才能以一種更可靠的方式找到這個日誌所討論的約束條件?

在此先感謝

+1

http://stackoverflow.com/questions/25630315/autolayout-unable-to-simultaneously-satisfy-constraints – luk2302

+0

@ luk2302非常感謝 – AppsDev

回答

0

您可以對約束進行重新排序,以便視圖以一致的順序出現。因此,原文:

<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]> 
<NSLayoutConstraint:0x17009b580 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(82)-[UILabel:0x14c51ed20'Welcome to...']> 
<NSLayoutConstraint:0x17009b2b0 V:[UILabel:0x14c51ed20'Welcome to...']-(30)-[UIView:0x14c51e7e0]> 
<NSLayoutConstraint:0x170280230 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(0)-[UIView:0x14c51e7e0]> 

變爲:

<NSLayoutConstraint:0x17009b580 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(82)-[UILabel:0x14c51ed20'Welcome to...']> 
<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]> 
<NSLayoutConstraint:0x17009b2b0 V:[UILabel:0x14c51ed20'Welcome to...']-(30)-[UIView:0x14c51e7e0]> 

<NSLayoutConstraint:0x170280230 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(0)-[UIView:0x14c51e7e0]> 

所以,你必須垂直,它和標籤之間MyApp.LogoHeaderView有82分的情況下閱讀 「歡迎到......」。該標籤高於或等於54分高。然後在它和UIView之間有30分。同時,你已經設置了一個約束條件,表示UIView和你的MyApp.LogoHeaderView之間應該沒有距離。衝突是一些約束要求在MyApp.LogoHeaderViewUIView之間至少有82 + 54 + 30 == 166點,而另一個約束則表示它們之間有0點。

您是否真的有多個地方在您的用戶界面中有MyApp.LogoHeaderView和標籤上顯示「歡迎來到...」?

+0

感謝您的詳細解釋。我在隱藏橫向時隱藏標籤,因此,在隱藏視圖時,您是否也應該刪除它們的約束? – AppsDev

+0

是的,或者修改約束的'constant'屬性,如果達到你想要的。隱藏的視圖仍然參與自動佈局。 (事實上​​,在引入UILayoutGuide之前,一些自動佈局技術通常涉及隱藏的「間隔」視圖。)如果您的目標是iOS 9.0+,則應考慮「UIStackView」,其中會自動調整視圖隱藏。 –

+0

非常感謝。另一個問題:當設備旋轉時,更改約束的正確方法是什麼?這就是爲什麼我得到「無法同時滿足約束」錯誤... – AppsDev

0

當你定義在IB的約束,我覺得這是沒有辦法獲得更多的信息。 但問題是什麼?你知道標籤和視圖。現在你可以看看你對這個觀點的限制。 最糟糕的情況是刪除所有對象並逐個添加它們,並在每次添加下一個項目時運行應用程序。然後你會發現錯誤。

相關問題