iOS equivalente a View.GONE

¿Hay un equivalente de iOS para Android View.GONE?

En Android, configurar una vista para GONE lo hará invisible y garantizará que la vista no ocupe espacio en el layout. Sé que con iOS, puedes configurar una vista oculta con

[viewName setHidden:true]; 

pero la vista todavía ocupa espacio en el layout, y creo que sería ineficiente eliminar completamente la vista y volver a crearla más tarde.

(nota: he visto esta publicación: el equivalente de iOS para el modo de visibilidad de Android View.GONE, pero no hay una respuesta aceptada, y la configuration de la altura a 0 no funcionó para mí, ya que las vistas posteriores de la página no cambiaron después de mi vista fue eliminada)

Agregue las restricciones de ancho / altura con constant = 0 a your View hará que your View tenga ancho y alto = 0 (como GONE )

 // set the height constraint to 0 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]]; // set the width constraint to 0 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]]; 

En swift

 // set the width constraint to 0 let widthConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0) view.addConstraint(widthConstraint) // set the height constraint to 0 let heightConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0) view.addConstraint(heightConstraint) 

O esta extensión de UIView

 extension UIView { func goAway() { // set the width constraint to 0 let widthConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0) superview!.addConstraint(widthConstraint) // set the height constraint to 0 let heightConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0) superview!.addConstraint(heightConstraint) } } 

Espero que esto ayude

Solo el posible equivalente puede ser AFAIK:

 [yourView removeFromSuperview] 

Hasta que elimine la view de su superview en ios , tendrá espacio en el layout.

Entonces, dependiendo de su necesidad, puede agregar o eliminar la vista cuando sea necesario (lo mismo que ver. GONE en Android).

Actualmente estoy haciendo la transición entre Android e iOS usando Swift y ese fue uno de mis primeros problemas. Después de search en Internet encontré que algunas personas tenían buenos resultados al establecer el alto o ancho de UIView en 0, dependiendo de si desea que la vista desaparezca vertical u horizontalmente. Para implementar esta idea en mi aplicación definí dos funciones así:

 enum Direction { case HORIZONTAL, VERTICAL } func removeView(view: UIView, direction: Direction) { // Removing the view vertically if direction == .VERTICAL { let constraint = NSLayoutConstraint(item: view as UIView, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 0) view.addConstraint(constraint) } else { // Removing the view horizontally let constraint = NSLayoutConstraint(item: view as UIView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 0) view.addConstraint(constraint) } } // Removing the view both horizontally and vertically func removeView(view: UIView) { let constraintH = NSLayoutConstraint(item: view as UIView, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 0) let constraintW = NSLayoutConstraint(item: view as UIView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 0) view.addConstraint(constraintH) view.addConstraint(constraintW) } 

Y parece funcionar en el simulador. Espero que esto ayude.

La solución más limpia para mí es incrustar los componentes que deseas "mover" en un StackView (iOS 9.0+), luego, llamando a UIView.isHidden = true en la vista deseada, logras exactamente el efecto StackView porque StackView envuelve el contenido