Despliegue automático del espacio al eliminar las vistas intermedias

Estoy un poco confundido en cuanto a cómo definir adecuadamente las restricciones que queuepsarán el espacio entre las vistas cuando se quita una vista determinada. He tratado de agregar restricciones verticales con una relación mayor o igual, sin embargo, parece que no se prefiere la distancia mínima para satisfacer la restricción.

Por ejemplo, dada la siguiente disposition con tres restricciones V: [A] -5- [B], V: [B] -5- [C] y V: [A] – (> = 5) – [C] :

[ View A ] | 5 pt | [ View B ] | 5 pt | [ View C ] 

Después de eliminar la vista BI, quiero que se vea así:

 [ View A ] | 5 pt | [ View C ] 

Pero se ve así:

 [ View A ] | 5 pt + 5 pt + height of view B | [ View C ] 

Si está buscando que esto sea escalable, probablemente deba hacerlo en código. Uso algo como

 UIView *superView = /* whatever the superview of your views is, probably self.view in a lot of cases */ NSArray *arrViews = [NSArray arrayWithObjects:/* put only the things you want to show in here, do not put the hidden things, and put them in order from top to bottom */, nil]; CGFloat buffer = 5; [superView addConstraint:[NSLayoutConstraint constraintWithItem:[arrViews objectAtIndex:0] attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1 constant:buffer]]; for (int i = 1; i < arrViews.count; i++) { [superView addConstraint:[NSLayoutConstraint constraintWithItem:[arrViews objectAtIndex:i] attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:[arrViews objectAtIndex:i-1] attribute:NSLayoutAttributeBottom multiplier:1 constant:buffer]]; } [superView addConstraint:[NSLayoutConstraint constraintWithItem:[arrViews lastObject] attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1 constant:-1*(buffer)]]; 

Esto pondrá un espaciado fijo (de size = buffer ) entre el elemento superior y su supervisión, luego entre cada subvista y la subvista directamente sobre él, luego entre la vista inferior y la supervista. Tendrá que llamar a esto cada vez que elimine un elemento de arrViews , luego llame a [superView needsLayout] . También debe asegurarse de que las restricciones de altura se configuren de alguna manera, o obtendrá errores. Si todo va a tener la misma altura, puede agregar otra línea en el ciclo para agregar una restricción de altura también.

Puede agregar V: [A] -5- [C] con una prioridad de amante, por debajo de 1000.

 [superview] | [ View A ] | | 5 pt (1000) | | | [ View B ] 5 pt (999) | | 5 pt (1000) | | | [ View C ] 

Debe volver a cablear mediante progtwigción las restricciones para que la restricción de la View C a la View B apunte a la View A y asegurarse de que la restricción de la View A a la View B se elimine. Después de hacer esto, llame a layoutIfNeeded en la super visión que contiene estas vistas.