Recientemente luché con errores de diseño automático al ocultar un archivo UIStackView
. En lugar de hacer un montón de libros y envoltorios UIViews
, opté por crear una salida para mí parentStackView
y para los niños que quiero ocultar / mostrar.
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
En el guión gráfico, así es como se ve mi parentStack:
Tiene 4 niños y cada uno de los niños tiene un montón de vistas de pila dentro de ellos. Cuando oculta una vista de pila, si tiene elementos de IU que también son vistas de pila, verá una secuencia de errores de diseño automático. En lugar de esconderme, opté por eliminarlos.
En mi ejemplo, parentStackViews
contiene una matriz de los 4 elementos: Vista de pila superior, StackViewNumber1, Vista de pila número 2 y Botón de parada. Sus índices en arrangedSubviews
son 0, 1, 2 y 3, respectivamente. Cuando quiero ocultar uno, simplemente lo parentStackView's
arrangedSubviews
elimino de la matriz. Dado que no es débil, permanece en la memoria y puede volver a colocarlo en el índice deseado más tarde. No lo estoy reinicializando, por lo que se cuelga hasta que se necesita, pero no hincha la memoria.
Entonces, básicamente, puedes ...
1) Arrastre IBOutlets para su pila principal y los elementos secundarios que desea ocultar / mostrar al guión gráfico.
2) Cuando desee ocultarlos, elimine la pila que desea ocultar de la parentStackView's
arrangedSubviews
matriz.
3) Llame self.view.layoutIfNeeded()
con UIView.animateWithDuration
.
Tenga en cuenta que los dos últimos stackViews no lo son weak
. Debes tenerlos cerca para cuando los muestres.
Digamos que quiero ocultar stackViewNumber2:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
Entonces anímalo:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Si desea "mostrar" stackViewNumber2
más tarde, puede insertarlo en el parentStackView
arrangedSubViews
índice deseado y animar la actualización.
parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)
// Then animate it
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Descubrí que eso es mucho más fácil que llevar la contabilidad de las limitaciones, jugar con las prioridades, etc.
Si tiene algo que desea ocultar de forma predeterminada, puede colocarlo en el guión gráfico y eliminarlo viewDidLoad
y actualizarlo sin que se use la animación view.layoutIfNeeded()
.