2012-06-28 23 views
7

私はCocoaのAutolayoutで遊んでいますが、いくつかのことはわかりません。Cocoa Autolayoutを使用して優先度に基づいて2つのサブビューのサイズを変更するにはどうすればよいですか?

私は1つのウィンドウに2つのビューを持っています。各ビューの幅は、親ウィンドウの幅の1/2です。

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

ウィンドウのサイズを変更した場合は、まずウィンドウのサイズを変更する必要があります。

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

View2が最小サイズに達すると、View1を最小サイズにサイズ変更します。

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

どうすればいいですか?

答えて

16

レイアウトが少し不明なようです。 view2はいつview1のサイズにマッチするのではなく収縮し始めますか?私はview1が柔らかい最小値に達するまでビューが同じサイズでなければならないと仮定しています。その時点で、最小値に達するまでview2がサイズ変更され、最小値に達するまでview1がサイズ変更されます。

制約に優先度を追加することで、この動作を実現できます。重要性のために我々は:

  1. VIEW1とVIEW2> =最小
  2. VIEW1> = view1SoftMinimum
  3. VIEW1 == VIEW2

をContraint 1は、ウィンドウのサイズ変更の優先度以上でなければなりません。私たちはそれを必要にすることができます(これがデフォルトです)。

制約2は制約3よりも上でなければなりませんが、NSLayoutPriorityDragThatCannotResizeWindowより下でなければなりません。私たちは、それが480

Contraint 3はcontraint 2以下でなければならないようになりますので、我々は我々はあなたが

|[view1(>=view1Minimum,>[email protected],[email protected])][view2(>=view2Minimum)]| 
を追加することができ、1つの視覚的なフォーマット文字列でそれらのcontraintsのすべてを表現することができ、それ479

作ります

次のコードでテストしました。

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]]; 
関連する問題