Układ wydaje się nieco nieokreślony. Kiedy zaczyna się zmniejszanie view2 zamiast dopasowywania rozmiaru view1? Zakładam, że widoki powinny mieć ten sam rozmiar, dopóki view1 nie osiągnie minimalnego minimum. W tym momencie view2 zmienia rozmiar, aż osiągnie minimum, a następnie view1 zmienia rozmiar, aż osiągnie minimum.
Możemy mieć to zachowanie, dodając priorytety do ograniczeń. W kolejności ważności mamy:
- view1 view2 i> = minimalna
- view1> = view1SoftMinimum
- view1 == view2
contraint 1 musi być powyżej priorytetu zmiany rozmiaru okna. Możemy uczynić go wymaganym (co jest domyślne).
Ograniczenie 2 musi być powyżej wartości granicznej 3, ale poniżej wartości NSLayoutPriorityDragThatCannotResizeWindow. Dołożymy musi 480.
contraint 3 contraint być poniżej 2, więc robimy to 479.
Możemy wyrazić wszystkie te contraints w jednym wizualnej ciągu formatu, który można dodać
|[view1(>=view1Minimum,>[email protected],[email protected])][view2(>=view2Minimum)]|
Oto kod, który testowałem:
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]];