2015-05-19 44 views
5

我是OS X可可開發新手,正在使用Yosemite的Storyboards開發Swift應用程序。如何使用自動佈局設置NSSplitView面板的最小和初始寬度?

在我的應用程序的主窗口中,我有一個NSSplitViewController。對於左側和右側的每個面板,我添加了一個將包含所有子視圖的根自定義視圖。

Storyboard Layout

使用自動佈局,我已將自定義視圖在拆分視圖中查看的邊緣,還定義了一個約束的自定義視圖的寬度要大於或等於一最小數量。

Autolayout Constraints

這一切工作正常。當窗口打開時,窗口寬度是兩個面板的最小寬度約束的總和。我無法弄清楚的是下一步。

如何給自定義視圖設置另一個寬度約束,以便當窗口打開時,它的初始寬度高於最小值(可以說是300)?我想要的是面板可以小到200,但我想要的初始大小爲300.我不希望窗口在允許的最小寬度下打開。然後,用戶將不得不每次調整大小,這不是一個好的用戶體驗。

爲了嘗試完成此操作,我爲自定義視圖中的較低優先級(嘗試了所有不同的值200,500,800等)的300添加了另一個寬度約束,但沒有一個會給我期望的結果寬度值是300,並具有200

Revised Autolayout constraints

的最小寬度必須有做到這一點的方式面板,但我只是難倒如何。請幫忙!

更新

下面是constraintsAffectingLayoutForOrientation輸出爲NSSplitViewController的看法:

<NSLayoutConstraint:0x6000000923e0 H:|-(0)-[NSView:0x600000124c40] (Names: '|':NSView:0x600000124ba0)>, 
<NSLayoutConstraint:0x6000000924d0 H:[NSView:0x600000124c40]-(0)-| (Names: '|':NSView:0x600000124ba0)>, 
<NSLayoutConstraint:0x600000092070 H:[NSView:0x600000124c40(>=200)]>, 
<NSLayoutConstraint:0x600000092660 _NSSplitViewItemViewWrapper:0x6000001416b0.width == NSView:0x600000124ba0.width>, 
<NSLayoutConstraint:0x600000093a10 H:|-(0)-[_NSSplitViewItemViewWrapper:0x6000001416b0](LTR) (Names: '|':NSSplitView:0x608000123b60)>, 
<NSLayoutConstraint:0x600000093b50 H:[_NSSplitViewItemViewWrapper:0x6000001416b0]-(1)-[_NSSplitViewItemViewWrapper:0x6000001429f0](LTR)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000093d80 h=-&- v=-&- H:[NSSplitView:0x608000123b60]-(0)-| (Names: '|':NSView:0x6000001242e0)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000093b00 h=-&- v=-&- H:|-(0)-[NSSplitView:0x608000123b60] (Names: '|':NSView:0x6000001242e0)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000094050 h=-&- v=-&- H:|-(0)-[NSView:0x6000001242e0] (Names: '|':NSThemeFrame:0x100940be0'Main Window')>, 
<NSLayoutConstraint:0x600000093c40 H:[_NSSplitViewItemViewWrapper:0x6000001429f0]-(0)-|(LTR) (Names: '|':NSSplitView:0x608000123b60)>, 
<NSLayoutConstraint:0x600000092890 H:[NSView:0x600000124f60]-(0)-| (Names: '|':NSView:0x600000124ec0)>, 
<NSLayoutConstraint:0x6000000926b0 H:[NSView:0x600000124f60(>=400)]>, 
<NSLayoutConstraint:0x608000099d20 _NSSplitViewItemViewWrapper:0x6000001429f0.width == NSView:0x600000124ec0.width>, 
<NSLayoutConstraint:0x600000092840 H:|-(0)-[NSView:0x600000124f60] (Names: '|':NSView:0x600000124ec0)>] 

由於大量約束,通過排序的,我決定做一個全新的測試項目和看看這是不是開箱即用,還是我在應用程序中改變了一些設置。在測試項目中,我剛剛刪除了視圖控制器,在窗口中添加了一個分割視圖控制器,併爲每個面板添加了兩個簡單的文本視圖。然後運行該項目,左側​​面板被摺疊。所以我爲每個文本視圖添加了一個最小寬度約束,然後在測試項目中發生了同樣的情況。無論我在故事板中設置了什麼,窗口大小都是最小寬度的添加。也許唯一的方法是通過代碼設置窗口/拆分視圖大小。

回答

6

你不應該添加額外的約束來強制這個。默認情況下,該窗口的大小會在故事板中配置。如果它變得越來越小,這表明存在迫使它變小的限制。

窗口將保持其優先級爲500(NSLayoutPriorityWindowSizeStayPut)。較高優先級的約束可以將它推到或拉到不同的大小。窗口當前的大小會覆蓋較低優先級的約束。

因此,您應該查找優先級高於500的試圖縮小它的約束。例如,內容擁抱控件的優先級。另一種可能性是分割視圖項目的優先級。如果這些大於500,並且從故事板加載的視圖的初始大小是最小的,那麼我希望分割視圖將更願意將它們保持在這些大小上,而不是窗口更願意保持其大小。

可能有用的診斷技術是記錄[someView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]。您可以爲窗口的contentView或分割視圖執行此操作。

相關問題