2012-06-28 19 views
7

我正在玩可可的Autolayout,有些事情對我來說並不明確。如何使用Cocoa Autolayout根據優先級調整兩個子視圖?

我在一個窗口有2個視圖。每個視圖的寬度是父窗口的1/2寬度。

|   |   | 
|   |   | 
| View1 | View2 | 
|   |   | 
|   |   | 

如果我調整窗口大小,我希望View2先調整大小。

|   |  | 
|   |  | 
| View1 |View2| 
|   |  | 
|   |  | 

當視圖2達到其最小尺寸我想視圖1被調整到它的最小尺寸。

|  |  | 
|  |  | 
|View1|View2| 
|  |  | 
|  |  | 

我該怎麼做?

回答

16

佈局似乎有點不明確。什麼時候view2開始縮小而不是匹配view1的大小?我認爲在view1達到最低限度之前視圖應該是相同的大小。此時,view2會調整大小,直到達到最小值,然後調整view1大小,直到達到最小值。

我們可以通過向約束添加優先級來實現這種行爲。按重要性的順序,我們有:

  1. 廠景和視圖2> =最小
  2. 廠景> = view1SoftMinimum
  3. 廠景==視圖2

Contraint 1必須在窗口調整大小優先上方。我們可以使它成爲必需的(這是默認的)。

約束2必須高於約束3,但低於NSLayoutPriorityDragThatCannotResizeWindow。我們將使它480

Contraint 3必須低於contraint 2,所以我們將其479

我們可以表達所有這些約束上的一個視覺格式字符串,您可以添加

|[view1(>=view1Minimum,>[email protected],[email protected])][view2(>=view2Minimum)]| 

這是我測試的代碼:

NSView *view1 = [[NSTextView alloc] initWithFrame:NSZeroRect]; 
NSView *view2 = [[NSTextView alloc] initWithFrame:NSZeroRect]; 

[view1 setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[view2 setTranslatesAutoresizingMaskIntoConstraints:NO]; 

NSView *contentView = [self.window contentView]; 

[contentView addSubview:view1]; 
[contentView addSubview:view2]; 

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(view1, view2); 

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view1]|" options:NSLayoutConstraintOrientationVertical metrics:NULL views:viewsDictionary]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view2]|" options:NSLayoutConstraintOrientationVertical metrics:NULL views:viewsDictionary]]; 


NSDictionary *metrics = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithFloat:300], @"view1SoftMinimum", 
         [NSNumber numberWithFloat:150], @"view1Minimum", 
         [NSNumber numberWithFloat:150], @"view2Minimum", nil]; 

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view1(>=view1Minimum,>[email protected],[email protected])]-[view2(>=view2Minimum)]|" options:0 metrics:metrics views:viewsDictionary]];