gpt4 book ai didi

cocoa - 如何使用 Cocoa Autolayout 根据优先级调整两个 subview 的大小?

转载 作者:行者123 更新时间:2023-12-03 16:07:01 27 4
gpt4 key购买 nike

我正在 Cocoa 中使用自动布局,有些事情对我来说并不清楚。

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

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

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

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

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

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

我怎样才能做到这一点?

最佳答案

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

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

  1. view1 和 view2 >= 最小值
  2. view1 >= view1SoftMinimum
  3. View 1 == View 2

约束 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]];

关于cocoa - 如何使用 Cocoa Autolayout 根据优先级调整两个 subview 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11244643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com