如何使用Cocoa Autolayout基于优先级调整两个子视图的大小?

时间:2012-06-28 12:27:10

标签: cocoa autolayout nslayoutconstraint

我在Cocoa玩Autolayout,有些事情对我来说不太清楚。

我在一个窗口上有2个视图。每个视图的宽度是父窗口的1/2宽度。

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

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

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

当View2达到其最小尺寸时,我希望将View1调整为其最小尺寸。

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

我该怎么做?

1 个答案:

答案 0 :(得分:16)

布局似乎有点不明确。 view2什么时候开始缩小而不是匹配view1的大小?我假设视图应该是相同的大小,直到view1达到软最小值。此时,view2会调整大小,直到达到最小值,然后view1会调整大小,直到达到最小值。

我们可以通过向约束添加优先级来实现此行为。按重要性排序:

  1. view1 and view2> = minimum
  2. view1> = view1SoftMinimum
  3. view1 == view2
  4. Contraint 1必须高于窗口大小调整优先级。我们可以使它成为必需的(默认)。

    约束2必须高于约束3,但低于NSLayoutPriorityDragThatCannotResizeWindow。我们将成为480。

    禁令3必须低于约束2,所以我们将其设为479.

    我们可以在一个可视化格式字符串中表达所有这些约束,您可以添加

    |[view1(>=view1Minimum,>=view1SoftMinimum@480,==view2@479)][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,>=view1SoftMinimum@480,==view2@479)]-[view2(>=view2Minimum)]|" options:0 metrics:metrics views:viewsDictionary]];