當約束系統具有兩個或更多有效解決方案時,會出現不明確的布局。 主要有兩個原因:
* 布局需要額外的約束來唯一地指定每個視圖的位置和位置。
確定哪些視圖不明確后,只需添加約束以唯一地指定視圖的位置及其大小。
* 布局具有相同優先級的沖突可選約束,并且系統不知道應該打破哪個約束。
在這里,您需要通過更改優先級以使它們不再相等來告訴系統它應該破壞哪個約束。 系統首先打破具有最低優先級的約束。
# 檢測模糊布局
與不可滿足的布局一樣,Interface Builder 通常可以在設計時檢測并提供修復模糊布局的建議。 這些歧義在問題導航器中顯示為警告,文檔輪廓中的錯誤和畫布中的紅線顯示為警告。 有關更多信息,請參閱識別不滿足的約束。
與不可滿足的布局一樣,Interface Builder 無法檢測到所有可能的歧義。 只有通過測試才能找到許多錯誤。
當運行時出現模糊布局時,自動布局會選擇可能使用的解決方案之一。 這意味著布局可能會或可能不會按預期顯示。 此外,沒有警告寫入控制臺,也沒有辦法為不明確的布局設置斷點。
因此,模糊布局通常比不可滿足的布局更難以檢測和識別。 即使歧義確實具有明顯的,可見的效果,也很難確定錯誤是由于模糊還是布局邏輯中的錯誤。
幸運的是,您可以調用一些方法來幫助識別模糊的布局。 所有這些方法都只能用于調試。 在可以訪問視圖層次結構的某處設置斷點,然后從控制臺調用以下方法之一:
* [hasAmbiguousLayout](https://developer.apple.com/documentation/uikit/uiview/1622517-hasambiguouslayout)。 適用于 iOS 和 OS X 。在錯誤放置的視圖上調用此方法。 如果視圖的幀不明確,則返回 YES。 否則,它返回 NO。
* [exerciseAmbiguityInLayout](https://developer.apple.com/documentation/uikit/uiview/1622545-exerciseambiguityinlayout) 。 適用于 iOS 和 OS X 。在布局不明確的視圖上調用此方法。 這將在可能的有效解決方案之間切換系統。
* [constraintsAffectingLayoutForAxis :](https://developer.apple.com/documentation/uikit/uiview/1622432-constraintsaffectinglayoutforaxi).。適用于 iOS。 在視圖上調用此方法。 它返回一個影響沿指定軸的視圖的所有約束的數組。
* [constraintsAffectingLayoutForOrientation:](https://developer.apple.com/documentation/appkit/nsview/1525968-constraintsaffectinglayout)。 適用于 OS X 。在視圖上調用此方法。 它返回一個數組,其中包含沿指定方向影響該視圖的所有約束。
* _autolayoutTrace。 在 iOS 中作為私有方法提供。 在視圖上調用此方法。 它返回一個字符串,其中包含有關包含該視圖的整個視圖層次結構的診 標記了不明確的視圖,并且將具有 [translateAutoresizingMaskIntoConstraints](https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco) 的視圖設置為 YES。
在控制臺中運行這些命令時,可能需要使用 Objective-C 語法。 例如,在斷點暫停執行后,在控制臺窗口中鍵入` call [self.myView exerciseAmbiguityInLayout]`以調用myView 對象上的 exerciseAmbiguityInLayout 方法。 同樣,鍵入 `po [self.myView autolayoutTrace]` 以打印出包含myView的視圖層次結構的診斷信息。
> 注意
> 在運行上面列出的診斷方法之前,務必解決 Interface Builder 發現的任何問題。 Interface Builder 嘗試修復它找到的任何錯誤。 這意味著如果它發現一個不明確的布局,它會添加約束,以便布局不再含糊不清。
> 因此,hasAmbiguousLayout 返回 NO。 exerciseAmbiguityInLayout 似乎沒有任何效果,constraintsAffectingLayoutForAxis:可能會返回其他意外約束。
>原文地址
>[Ambiguous Layouts](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/AmbiguousLayouts.html#//apple_ref/doc/uid/TP40010853-CH18-SW1)