Estoy tratando de agregar vistas en UIStackView mediante programación. Por ahora mi código es:
UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 100, 100)];
UIView *view2 = [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];
[self.stack1 addArrangedSubview:view1];
[self.stack1 addArrangedSubview:view2];
Cuando implemento la aplicación, solo hay 1 vista y es de color negro (view1 también obtiene los parámetros para view2)
ios
objective-c
ios9
uistackview
Altimir Antonov
fuente
fuente
addArrangedSubview:
, noaddSubview:
Respuestas:
Las vistas de pila utilizan el tamaño de contenido intrínseco, por lo tanto, use restricciones de diseño para definir las dimensiones de las vistas.
Hay una manera fácil de agregar restricciones rápidamente (ejemplo):
Código completo:
Nota: Esto fue probado en iOS 9
fuente
UIViews
no. Si el póster original hubiera usadoUILabel
instancias en lugar deUIView
, su código habría funcionado como esperaba. Agregué un ejemplo que demuestra esto a continuación.Swift 5.0
Basado en la respuesta @ user1046037.
fuente
activate(_:)
, y generalmente es más eficiente hacerlo de esta manera developer.apple.com/documentation/uikit/nslayoutconstraint/…UIStackView
usa restricciones internamente para colocar sus subvistas organizadas. Exactamente qué restricciones se crean depende de cómo esté configurada la vista de la pila. De forma predeterminada, una vista de pila creará restricciones que expondrán sus subvistas organizadas en una línea horizontal, fijando las vistas iniciales y finales a sus propios bordes iniciales y finales. Entonces su código produciría un diseño que se ve así:El espacio que se asigna a cada subvista está determinado por una serie de factores, incluido el tamaño del contenido intrínseco de la subvista y su resistencia a la compresión y las prioridades de contenido. Por defecto, las
UIView
instancias no definen un tamaño de contenido intrínseco. Esto es algo que generalmente proporciona una subclase, comoUILabel
oUIButton
.Dado que la resistencia a la compresión de contenido y las prioridades de abrazo de contenido de dos
UIView
instancias nuevas serán las mismas, y ninguna de las vistas proporciona un tamaño de contenido intrínseco, el motor de diseño debe adivinar qué tamaño debe asignarse a cada vista. En su caso, está asignando a la primera vista el 100% del espacio disponible, y nada a la segunda vista.Si modifica su código para usar
UILabel
instancias en su lugar, obtendrá mejores resultados:Tenga en cuenta que no es necesario crear explícitamente ninguna restricción usted mismo. Este es el principal beneficio del uso
UIStackView
: oculta los detalles (a menudo feos) de la gestión de restricciones del desarrollador.fuente
UIView
sí mismas no tienen un tamaño intrínseco. Es posible que deba aplicar restricciones adicionales a estas vistas para que la vista de pila sepa qué tan grande es hacerlas.MyTextField.top = top+20
ybottom = MyTextField.bottom+20
. Esperaría que esto le diera a mi punto de vista una altura intrínseca de 70, pero en cambio se queja de restricciones conflictivas. ¿Sabes lo que está pasando aquí? Es esta vista la que quiero colocar dentro de mi UIStackView.En Swift 4.2
fuente
Tienes que establecer tu tipo de distribución. En su código, solo agregue:
O puede configurar la distribución directamente en su generador de interfaces. Por ejemplo:
Espero que ayude;) Lapinou.
fuente
Siguiendo dos líneas solucionó mi problema
Versión rápida -
fuente
Para la respuesta aceptada cuando intenta ocultar cualquier vista dentro de la vista de pila, la restricción no funciona correctamente.
Razón es cuando la piel
view
destackView
esta forma se establece la altura de 0 a animarlo.La solución cambia la restricción
priority
como se muestra a continuación.fuente
Mejorado en la respuesta por @Oleg Popov
fuente
En mi caso, lo que estaba jugando con lo que esperaba era que me faltaba esta línea:
Después de eso, no es necesario establecer restricciones para mis subvistas organizadas, el stackview se encarga de eso.
fuente
Versión Swift 5 de la respuesta de Oleg Popov , que se basa en la respuesta del usuario 1046037
fuente
Acabo de encontrar un problema muy similar. Tal como se mencionó anteriormente, las dimensiones de la vista de pila dependen de un tamaño de contenido intrínseco de las subvistas organizadas. Aquí está mi solución en Swift 2.xy la siguiente estructura de vista:
vista - UIView
customView - CustomView: UIView
stackView - UISTackView
subvistas organizadas - subclases de UIView personalizadas
fuente
Prueba el siguiente código,
Espero que funcione. Avíseme si necesita más aclaraciones.
fuente