2012-12-12 142 views
2

我正在嘗試使用Mac OS X 10.7的自動佈局進行設計。在Mac OS X中自動佈局和調整視圖大小

我的應用程序有一個固定寬度/高度的窗口。 我真正想要做的是調整窗口中的控件大小。 例如,我有一個搜索字段,如果點擊該字段,它應該展開&摺疊。 我在左側定位了一個NSPathControl,如果NSSearchField展開,它應該收縮,所以它們不會摺疊。

現在,它的工作如果我調整窗口的大小,但如果我在代碼中設置視圖的框架,它不。 Autolayout只是忽略了這一點。我只是在做[[this animator] setFrame:newFrame];

有什麼我必須在自動佈局中啓用,還是我必須在代碼中設置不同的框架?

編輯

我得到的約束通過在搜索字段設置self.translatesAutoresizingMaskIntoConstraints = YES;工作。 我不確定這是否是一個好主意。

此外,它給了我以下日誌:

2012-12-12 19:41:30.958 Expanding Search[1428:303] Unable to simultaneously satisfy constraints: 
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(1)-| (Names: '|':ITPathbar:0x10190a670)>", 
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-| (Names: '|':ITPathbar:0x10190a670)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-| (Names: '|':ITPathbar:0x10190a670)> 

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens. And/or, break on objc_exception_throw to catch this in the debugger. 
2012-12-12 19:41:32.835 Expanding Search[1428:303] 74 
2012-12-12 19:41:32.854 Expanding Search[1428:303] Unable to simultaneously satisfy constraints: 
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(14.5)-| (Names: '|':ITPathbar:0x10190a670)>", 
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-| (Names: '|':ITPathbar:0x10190a670)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-| (Names: '|':ITPathbar:0x10190a670)> 

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens. And/or, break on objc_exception_throw to catch this in the debugger. 
+0

據我進入自動佈局,我明白你不應該調用'-setFrame:'。你能解釋你如何設置約束條件嗎? Cocoa如何分割搜索和路徑控件之間的空間?他們總是在相同的比例?有什麼限制讓他們這樣? – paulmelnikow

+0

@noa我有一個簡單的窗口,靈活的高度和寬度。所以你可以調整窗口大小。然後我有一個自定義搜索欄,它可以改變它的寬度,固定在窗口的右上角。另外,我還有一個按鈕,就像測試一樣,固定在搜索欄的左側。現在,我現在使用'setFrame:'設置寬度,並且我還必須將'translatesAutoresizingMaskIntoConstraints'設置爲'YES' – NSAddict

+0

@noa好吧,我發現你可以設置'[[constraint animator] setConstant:newWidth];'它的工作原理。現在我只剩下一個問題了,我不確定如何才能真正獲得寬度約束。我用'[self constraints]'得到了所有的約束條件,這是我例子中的第一個約束條件,但當然可以改變。我可以建立一個渠道,但這看起來不太聰明。 – NSAddict

回答

2

我的解決方案


我得到了它,我發表了它在Github上正確here

我還問了另一個更具體的問題,這個問題解決了here


事情是,你實際上不應該調用setFrame:當你使用autolayout。你應該得到正確的約束並改變它。它使它更容易,您可以簡單地設置寬度,並自動爲您處理幀原點。

相關問題