2015-07-21 64 views
0

經過自定義的漫遊和自定義演示動畫之後,我設置了呈現視圖的約束條件。爲什麼在設置約束條件後無法再調整NSWindow的大小?

let views = ["view" : childVC.view] 
let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: [], metrics: nil, views: views) 
let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: [], metrics: nil, views: views) 
parentVC.view.addConstraints(horizontalConstraints) 
parentVC.view.addConstraints(verticalConstraints) 

當我打印出父/呈現viewcontroller的視圖的約束時,只有這四個約束。現在我希望我的子視圖可以像NSWindow一樣調整大小,但兩者都不能再調整大小。

我也給translatesAutoresizingMaskIntoConstraint = false一個嘗試,但我真的不明白它。此外,它從視圖中刪除所有內容。

那麼我在這裏錯過了什麼?

回答

1

聽起來好像您的視圖並未在內部使用自動佈局。它依賴於舊的彈簧和支柱模型。這就是爲什麼當你關閉translatesAutoresizingMaskIntoConstraint它「消除一切」。更有可能的是,該視圖正在縮小到零大小,因爲沒有任何約束來保持其大小和位置了。

translatesAutoresizingMaskIntoConstraint打開時,會生成約束以將視圖保留在爲其明確設置的最後一幀。如果其超級視圖調整大小,並且超級視圖自動調整其子視圖(這是默認設置),視圖將根據其autoresizingMask調整大小。但自動佈局排序不知道會發生。生成的約束保持框架一樣,直到超級視圖改變。

但是,您還在窗口的內容視圖和視圖之間添加了約束。這些約束有效地防止窗口調整大小,因爲視圖的約束不允許佈局系統調整其大小。只有對其框架的明確更改才能做到這一點。你有點像22型。如果視圖的大小調整了大小,視圖將調整大小,但超視圖無法調整大小,因爲視圖對它有不靈活的限制。

一般來說,當您使用的視圖處於translatesAutoresizingMaskIntoConstraint的狀態時,您可以有效地將其他約束應用於該視圖。你不能真正使用約束來「推」視圖的框架或大小。您只能從該視圖鬆散地「掛起」其他視圖。

無論如何,你需要爲你的視圖採用自動佈局,或者不要在它和它的超級視圖之間設置約束。而是依賴於自動調整機制。

+0

這聽起來幾乎可以理解。我不明白的是,爲什麼我的NSVisualEffect視圖對內容視圖的相同約束使窗口保持可調整大小。唯一的區別是我可以看到NSVisualEffect視圖是通過IB建立的,而不是通過代碼。 – Marc

+1

對於啓用了自動佈局的NIB或故事板,IB將關閉所有視圖的「translatesAutoresizingMaskIntoConstraint」(除了任何獨立的頂級視圖之外,這些視圖會將視圖保留給您)。 –

+0

我的錯誤是,我將'translatesAutoresizingMaskIntoConstraints = false'設置爲內容視圖,而不是子視圖。現在一切都按預期工作。 – Marc

相關問題