基于自动布局的 cocoa 拆分视图在每次调整大小后都会恢复到原来的大小

Autolayout-based cocoa split view snaps back to old size after each resize

为了演示我的问题,我创建了一个带有界面生成器的简单测试应用程序,它是默认的 window 并附加了默认的 viewcontroller(链接到 ViewController.m class in XCode),viewcontroller(在界面生成器中)包含垂直拆分视图。然后将此拆分视图的右侧子视图链接到 ViewController.h:ViewController 界面中的 "IBOutlet NSView *right;"。

最后,在 ViewController.m 中,我有以下代码:

+ (void)addConstraint:(NSLayoutAttribute)type relatedBy:(NSLayoutRelation)relation
            superview:(NSView *)superview subview:(NSView *)subview
{
    [superview addConstraint:[NSLayoutConstraint constraintWithItem:subview
                                                          attribute:type
                                                          relatedBy:relation
                                                             toItem:superview
                                                          attribute:type
                                                         multiplier:1
                                                           constant:0]];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    int numObjects = 3;
    NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i < numObjects; i++) {
        NSTextField *label = [[NSTextField alloc] init];
        [label setEditable:NO];
        label.bezeled = NO;
        label.editable = NO;
        label.drawsBackground = NO;
        [label setTranslatesAutoresizingMaskIntoConstraints:NO];
        [label setAutoresizesSubviews:YES];
        [label setStringValue:[NSString stringWithFormat:@"%d", i]];
        [array addObject:label];
    }

    NSStackView *stackView = [NSStackView stackViewWithViews:array];
    [stackView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [stackView setAutoresizesSubviews:YES];
    stackView.orientation = NSUserInterfaceLayoutOrientationVertical;
    [right addSubview:stackView];
    [[self class] addConstraint:NSLayoutAttributeLeft   relatedBy:NSLayoutRelationEqual superview:right subview:stackView];
    [[self class] addConstraint:NSLayoutAttributeRight  relatedBy:NSLayoutRelationEqual superview:right subview:stackView];
    for (int i = 0; i < [array count]; i++) {
        NSView *view = [array objectAtIndex:i];
        [[self class] addConstraint:NSLayoutAttributeLeft   relatedBy:NSLayoutRelationEqual superview:stackView subview:view];
        [[self class] addConstraint:NSLayoutAttributeRight  relatedBy:NSLayoutRelationEqual superview:stackView subview:view];
    }
}

使用拆分视图的手柄调整大小有效,欢呼!现在,问题是,一旦我将 "int numObjects = 3;" 更改为任何大于 3 的数字(例如:"int numObjects = 4;"),调整大小行为就会中断。现在,如果我在 left/right 两半之间拖动拆分手柄,它会在我的鼠标按钮仍处于按下状态时适当调整大小;但是,如果我松开鼠标按钮,拆分视图将恢复到其旧的(调整大小前)配置,右半部分是可能的最小尺寸。

我做错了什么?

我最终通过 google-fu 解决了这个问题:尝试找到正确的关键字以找到正确的 Whosebug 解决方案。 This post 解释了如何解决它,基本上是通过将拆分视图中右窗格的 "holding priority" 从 250 更改为 251。