Estoy desarrollando una aplicación para iOS y estoy usando Storyboard con AutoLayout ON. Uno de mis controladores de vista tiene un conjunto de 4 botones y, en determinadas circunstancias, me gustaría hacer desaparecer el primero.
Si utilizo el setHidden:TRUE
método, el UIButton se vuelve invisible pero obviamente todavía ocupa espacio en la vista, y el resultado es un "agujero" que no he podido llenar haciendo que el UIButton restante flote hacia la parte superior de la vista principal.
En Android, simplemente lo hubiera usado en View.GONE
lugar de View.INVISIBLE
, pero en iOS estoy atascado con este comportamiento y no quiero creer que la única solución es mover manualmente (sí, me refiero a programación) los elementos restantes a la parte superior.
Pensé que habría podido hacerlo estableciendo algún tipo de restricción para que todo fuera tan automático como en Android, pero no tuve suerte.
Antes de desactivar el diseño automático, ¿alguien puede indicarme la dirección correcta?
Estoy usando el IB, pero también me siento cómodo con las cosas programáticas.
ACTUALIZAR:
Establecer la altura del componente en 0 tampoco ayuda.
Intenté algo como esto:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
fuente
Respuestas:
Agregar una restricción (NSLayoutAttributeHeight) que establece la altura de la vista en 0 funcionó para mí:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
fuente
self.view.addConstraint(NSLayoutConstraint(item: self.captchaView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 0))
Unable to simultaneously satisfy constraints
. mientras que ya tenía restricciones para la vista. Lo resuelvoTodas las respuestas a estas preguntas son ineficientes. La mejor manera de equvailent de Android setVisibility: El método pasado en iOS es que
StackView
primero seleccione los componentes y luego en el editor, incruste, Stack View,conecte la nueva vista de pila con IBOutlet, luego:
oculto:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = YES;
visibilidad:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = NO;
Al usar la vista de pila, se mantendrán todas las restricciones.
Documento
fuente
agregue una restricción de altura a su vista de la siguiente manera:
luego haga una salida para la restricción de altura en su archivo viewController de la siguiente manera:
Y luego, en su método viewDidLoad, cambie la altura de la restricción a 0 de la siguiente manera:
override func viewDidLoad() { super.viewDidLoad() nsLcButtonHeight.constant = 0 }
fuente
Para lograr la funcionalidad Androids.GONE en iOS es usar un UIStackView. Después de eso, esconde al niño por posición. ( Documentación de manzanas )
SWIFT 4:
let firstView = cell.rootStackView.arrangedSubviews[0] firstView.isHidden = true // first view gone
Es un ejemplo de celda de tabla, solo coloque ambos lados
Stack view
y obtenga el elemento paraGONE
el niño.fuente
Lo que puede hacer es agrupar sus vistas en una vista de pila. Luego, cuando oculte una vista en particular, las vistas restantes se cambiarán automáticamente para llenar el espacio.
Es posible que desee consultar la documentación de Apple sobre vistas de pila: https://developer.apple.com/reference/uikit/uistackview
o tutoriales en línea como: https://www.appcoda.com/stack-views-intro/
fuente
1) Si sus botones están colocados verticalmente, debe establecer el valor
height
en 0 y, en el caso de los botones colocados horizontalmente, intente establecerlowidth
en 0 o puede establecer ambos en 0.O
2) puede probar este enfoque que se basa
button2
enbutton1
:- (void)viewDidLoad { [super viewDidLoad]; UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button1 setTitle:@"hello" forState:UIControlStateNormal]; UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button2 setTitle:@"world" forState:UIControlStateNormal]; [button1 sizeToFit]; [button2 sizeToFit]; [button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)]; [self.view addSubview:button1]; [self.view addSubview:button2]; }
fuente
https://github.com/tazihosniomar/LayoutManager
Espero que te ayude .
fuente
Esta pregunta es bastante antigua, pero lo que encontré en el armario es establecer restricciones adicionales (para que las vistas alrededor de la vista "desaparecida" sepan qué hacer una vez que falta)
A which you want to be A | after setting B to gone | B C | C
bConstraints
. Haz esto por:bConstraints
.@IBOutlet var bConstraints: [NSLayoutConstraint]!
en su ViewControllerEntonces esconde B
B.hidden = true NSLayoutConstraint.deactivateConstraints(bConstraints)
Para mostrar
B.hidden = false NSLayoutConstraint.activateConstraints(bConstraints)
Obviamente, cuantas más vistas tenga, más complejo se volverá, ya que necesita restricciones adicionales de cada vista.
fuente
Outlet
aOutlet Collection
. Para restricciones adicionales, presione Ctrl y arrastre directamente al nombre de la variable. Puedo subir instantáneas hoy más tarde (en ~ 8 horas)Como ha demostrado mi investigación, ni siquiera AutoLayout puede ayudarlo. Debe reemplazar manualmente las vistas afectadas por el componente que se muestra opcionalmente (en mi caso, todas las vistas en la parte inferior de la vista opcional, pero estoy seguro de que puede adaptar esto para manejar todos los botones a la derecha de su botón opcional ):
- (IBAction)toggleOptionalView:(id)sender { if (!_expanded) { self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight); self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height); _expanded = YES; } else { self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0); self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height); _expanded = NO; } }
Es recomendable no codificar la altura / ancho de los componentes opcionales, de lo contrario, su código se rompe cada vez que edita el XIB / Storyboard. Tengo un campo float _optionalHeight que configuré en viewDidLoad, por lo que siempre está actualizado.
fuente
También puede borrar la página, o al menos ciertas celdas de la página, y redefinir todo. Es rápido y funciona bien. No escribí el código, pero lo encontré en este proyecto preexistente en el que estoy trabajando. Crea
ManagementTableSection
yManagementTableCell
clases para gestionarlo todo. Lo siento, no puedo proporcionar un código mejor definido.fuente
Partiendo de la respuesta proporcionada por Deniz, aquí hay una solución que utiliza restricciones en Swift
Por ejemplo: si tiene 3 vistas, A_view B_view y C_view alineadas verticalmente en ese orden y desea "Ocultar" B y también ajustar la diferencia, agregue una restricción
B_view.removeFromSuperView() var constr = NSLayoutConstraint(item: C_view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: A_view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 20) view.addConstraint(constr)
constante es (en este caso) la cantidad de espacio vertical entre C_view y A_view
fuente
Agregué una nueva propiedad a una implementación personalizada de UIView llamada "visible" que, cuando se establece en falso, agrega una restricción para contraer la vista (solo agregué una restricción de ancho ya que mi lista es horizontal, pero la mejor manera podría ser agregar una restricción de altura de 0 también).
var visible:Bool = true{ didSet{ if(visible){ clipsToBounds = false; removeConstraint(hideConstraint!) }else{ clipsToBounds = true addConstraint(hideConstraint!) } } }
Debe inicializar la restricción de ancho cero en la vista y agregarla como un campo:
private var hideConstraint:NSLayoutConstraint? func someInitFunction(){ hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0) ... }
fuente
setHidden: TRUE / FALSE es el equivalente más cercano a Android View.GONE / VISIBLE.
¡La vista no necesariamente ocupa espacio si no es visible!
He creado un ComboBox-Alike con un ListView encima de otras vistas. Solo soy visible al seleccionar:
fuente