2012-06-28 10 views
7

Estoy jugando con Autolayout en Cocoa y algunas cosas no están claras para mí.¿Cómo cambiar el tamaño de dos subvistas basadas en prioridades usando Cocoa Autolayout?

Tengo 2 puntos de vista en una ventana. El ancho de cada vista es 1/2 ancho de la ventana principal.

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

Si cambio el tamaño de una ventana, quiero que View2 cambie su tamaño primero.

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

Cuando View2 alcanza su tamaño mínimo, quiero que se cambie el tamaño de View1 a su tamaño mínimo.

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

¿Cómo puedo hacer eso?

Respuesta

16

El diseño parece un poco no especificado. ¿Cuándo view2 comienza a reducirse en lugar de coincidir con el tamaño de view1? Supongo que las vistas deben tener el mismo tamaño hasta que view1 alcance un mínimo. En ese punto, view2 cambia el tamaño hasta que alcanza su mínimo, y luego view1 cambia de tamaño hasta que alcanza su mínimo.

Podemos tener este comportamiento agregando prioridades a las restricciones. En orden de importancia tenemos:

  1. Vista1 y View2> = mínimo
  2. Vista1> = view1SoftMinimum
  3. Vista1 == View2

contraint 1 debe estar por encima de la prioridad ventana de cambio de tamaño. Podemos hacerlo obligatorio (que es el predeterminado).

Restricción 2 debe estar por encima de contraint 3, pero debajo de NSLayoutPriorityDragThatCannotResizeWindow. Lo haremos 480.

contraint 3 debe estar por debajo de contraint 2, por lo que lo hacemos 479.

podemos expresar todas esas contraints en una cadena de formato visual, que puede agregar

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

Aquí está el código que probé 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]]; 
Cuestiones relacionadas