2012-06-28 10 views
7

Gram z Autolayout w Cocoa, a niektóre rzeczy nie są dla mnie jasne.Jak zmienić rozmiar dwóch subskrybentów na podstawie priorytetów za pomocą Cocoa Autolayout?

Mam 2 widoki w oknie. Szerokość każdego widoku wynosi 1/2 szerokości okna nadrzędnego.

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

Jeśli zmieniam rozmiar okna, chcę najpierw zmienić rozmiar widoku2.

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

Kiedy View2 osiągnie swój minimalny rozmiar, chcę zmienić rozmiar View1 na jego minimalny rozmiar.

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

Jak mogę to zrobić?

Odpowiedz

16

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:

  1. view1 view2 i> = minimalna
  2. view1> = view1SoftMinimum
  3. 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]];