如果您沒有正確限制視圖,自動佈局將添加自己的約束,以確保它被正確約束。在您的例子中,你可以看到自動佈局已通過登錄屬於窗口的contentView
(進度指示器的上海華盈)的約束補充說:
var contentView = window.contentView as! NSView
for constraint in contentView.constraints {
println(constraint)
}
/*
<NSLayoutConstraint:0x6... V:[NSProgressIndicator:0x6...]-(20)-| (Names: '|':NSView:0x6...)>
<NSLayoutConstraint:0x6... H:|-(20)-[NSProgressIndicator:0x6...] (Names: '|':NSView:0x6...)>
<NSIBPrototypingLayoutConstraint:0x6... 'IB auto generated at build time for view with ambiguity' H:|-([email protected])-[NSProgressIndicator:0x6...](LTR) priority:251 (Names: '|':NSView:0x6...)>
<NSIBPrototypingLayoutConstraint:0x6... 'IB auto generated at build time for view with ambiguity' V:|-([email protected])-[NSProgressIndicator:0x6...] priority:251 (Names: '|':NSView:0x6...)>
<NSIBPrototypingLayoutConstraint:0x6... 'IB auto generated at build time for view with ambiguity' H:[NSProgressIndicator:0x6...([email protected])] priority:251>
*/
注意其標識包括IB汽車在編譯的時候產生的短語的約束含糊不清的視圖 - 這些都是Auto Layout必須創建的約束,以防止模糊的佈局。特別要注意這些約束第二:
V:|-([email protected])-[NSProgressIndicator:0x6...] priority:251
這話說,如有可能,確保進度指示器的頂部邊緣總是從它的父的頂部邊緣(在精確值322個的像素你的程序將會有所不同 - 它將會出現在你的xib中的兩條邊之間的距離)。垂直放大視圖時,自動佈局將嘗試找到一種方法來遵守這兩個約束,並且可以通過調整進度指示器的高度來實現這一點。這很難看,因爲進度指示器沒有邊框,但在上一次截圖中,指示器的高度約爲400像素,而其頂部和底部邊緣與相應超級視角邊緣的距離是恆定的。
要獲得您需要阻止自動佈局使用它在不明確佈局情況下添加的約束的行爲。如果你給你的進度指示器一個高度約束,自動佈局將無法同時滿足兩個垂直約束,所以它只會滿足具有較高優先級的約束 - 這是你的約束 - 一個固定底邊(1000 vs 251 )。 (當然你也應該完全限制它的水平位置。)
當控件周圍出現紅色框時,表示約束不完整,並且不能按預期工作。點擊國際文憑組織文件大綱中的紅色圖標,找出缺失的部分。 –
只是固定左邊緣,並檢查其工作與否 –
只要給NSProgressIndicator引導和尾隨約束。 – Wolverine