2012-06-28 10 views
7

Sto giocando con Autolayout a Cocoa e alcune cose non sono chiare per me.Come ridimensionare due sottoview in base alle priorità usando Cocoa Autolayout?

ho 2 di vista su una finestra. La larghezza di ogni vista è 1/2 larghezza della finestra genitore.

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

Se ridimensiono una finestra, desidero prima ridimensionare View2.

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

Quando View2 raggiunge le dimensioni minime, desidero che Vista1 venga ridimensionata alla sua dimensione minima.

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

Come posso farlo?

risposta

16

Il layout sembra un po 'non precisata. Quando view2 inizia a ridursi invece di corrispondere alla dimensione di view1? Suppongo che le viste debbano essere della stessa dimensione finché view1 non raggiunge un minimo minimo. A quel punto, la vista 2 viene ridimensionata fino a raggiungere il minimo, quindi la vista 1 viene ridimensionata fino a raggiungere il minimo.

possiamo avere questo comportamento con l'aggiunta di priorità da vincoli. In ordine di importanza abbiamo:

  1. view1 e view2> = minimo
  2. view1> = view1SoftMinimum
  3. view1 == view2

Contraint 1 deve essere sopra la priorità ridimensionamento della finestra. Possiamo renderlo obbligatorio (che è l'impostazione predefinita).

vincolo 2 deve essere superiore contraint 3, ma al di sotto NSLayoutPriorityDragThatCannotResizeWindow. Lo faremo 480.

Contraint 3 deve essere inferiore a contraint 2, quindi lo facciamo 479.

possiamo esprimere tutti quei vincoli in una stringa di formato visivo, che è possibile aggiungere

|[view1(>=view1Minimum,>[email protected],[email protected])][view2(>=view2Minimum)]| 

Ecco il codice che ho provato con:

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]]; 
Problemi correlati