基于自动布局的 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。
为了演示我的问题,我创建了一个带有界面生成器的简单测试应用程序,它是默认的 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。