2016-03-11 162 views
0

簡單的問題,但不知何故,我無法讓它工作。所以我有一個NSProgressIndicator,我想要固定在窗口的底部,但是當我添加NSProgressIndicator的底部約束時,指示器不會固定到底部,而是指示器和底部之間的距離會隨着I增加窗口的大小。將一個NSProgressIndicator固定到底部

下面是參考一對夫婦圖片:

什麼也沒有,但進度指示器和約束在其mainmenu.xib

新項目的圖片當視圖爲小的約束舉行

但爲什麼用約束隨着我增加窗口的大小而改變?

我試圖用一個按鈕和一個文本字段同樣的事情,它適用於另外兩個控制的觀點,它只是不與NSProgressIndicator工作。

任何想法,爲什麼會發生這種情況,任何解決方案(甚至解決方法將很好)將是偉大的!

+1

當控件周圍出現紅色框時,表示約束不完整,並且不能按預期工作。點擊國際文憑組織文件大綱中的紅色圖標,找出缺失的部分。 –

+0

只是固定左邊緣,並檢查其工作與否 –

+1

只要給NSProgressIndicator引導和尾隨約束。 – Wolverine

回答

1

如果您沒有正確限制視圖,自動佈局將添加自己的約束,以確保它被正確約束。在您的例子中,你可以看到自動佈局已通過登錄屬於窗口的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 )。 (當然你也應該完全限制它的水平位置。)