El siguiente código se puede encontrar en este ejemplo en vivo
Tengo el siguiente elemento nativo de reacción:
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
} = React;
var SampleApp = React.createClass({
render: function() {
return (
<View style={styles.container}>
<View style={styles.descriptionContainerVer}>
<View style={styles.descriptionContainerHor}>
<Text style={styles.descriptionText} numberOfLines={5} >
Here is a really long text that you can do nothing about, its gonna be long wether you like it or not, so be prepared for it to go off screen. Right? Right..!
</Text>
</View>
</View>
<View style={styles.descriptionContainerVer2}>
<View style={styles.descriptionContainerHor}>
<Text style={styles.descriptionText} numberOfLines={5} >Some other long text which you can still do nothing about.. Off the screen we go then.</Text>
</View>
</View>
</View>);
}
});
AppRegistry.registerComponent('SampleApp', () => SampleApp);
con los siguientes estilos:
var styles = StyleSheet.create({
container:{
flex:1,
flexDirection:'column',
justifyContent: 'flex-start',
backgroundColor: 'grey'
},
descriptionContainerVer:{
flex:0.5, //height (according to its parent)
flexDirection: 'column', //its children will be in a row
alignItems: 'center',
backgroundColor: 'blue',
// alignSelf: 'center',
},
descriptionContainerVer2:{
flex:0.5, //height (according to its parent)
flexDirection: 'column', //its children will be in a row
alignItems: 'center',
backgroundColor: 'orange',
// alignSelf: 'center',
},
descriptionContainerHor:{
//width: 200, //I DON\'T want this line here, because I need to support many screen sizes
flex: 0.3, //width (according to its parent)
flexDirection: 'column', //its children will be in a column
alignItems: 'center', //align items according to this parent (like setting self align on each item)
justifyContent: 'center',
flexWrap: 'wrap'
},
descriptionText: {
backgroundColor: 'green',//Colors.transparentColor,
fontSize: 16,
color: 'white',
textAlign: 'center',
flexWrap: 'wrap'
}
});
Esto da como resultado la siguiente pantalla:
¿Cómo puedo evitar que el texto salga de la pantalla y mantenerlo confinado en el medio de la pantalla con un ancho de, por ejemplo, el 80% del padre?
No creo que deba usarlo width
porque lo ejecutaré en MUCHAS pantallas móviles diferentes y quiero que sea dinámico, así que creo que debería confiar totalmente en él flexbox
.
(Esa fue la razón inicial por la que tuve flex: 0.8
dentro del descriptionContainerHor
.
Lo que quiero lograr es algo como esto:
¡Gracias!
fuente
flexShrink: 1
aplicación a la vista principal también ayudará.Este es un error conocido .
flexWrap: 'wrap'
no funcionó para mí, pero esta solución parece funcionar para la mayoría de las personasCódigo
Estilos
fuente
La solución a ese problema es
flexShrink: 1
.Dependiendo de su configuración, es posible que también deba agregar
flexShrink: 1
al elemento principal de<View>
'para que esto funcione, así que juegue con eso y lo logrará.La solución fue descubierta por Adam Pietrasiak en este hilo.
fuente
solo necesita tener una envoltura para su
<Text>
con flex como se muestra a continuación;fuente
flex: 1
es todo lo que necesitas.Funciona si elimina
flexDirection: row
dedescriptionContainerVer
ydescriptionContainerVer2
respectivamente.ACTUALIZAR (ver comentarios)
Hice algunos cambios para lograr lo que creo que buscas. En primer lugar, eliminé el
descriptionContainerHor
componente. Luego configuré lasflexDirection
vistas verticales enrow
y agreguéalignItems: 'center'
yjustifyContent: 'center'
. Dado que las vistas verticales ahora están apiladas a lo largo del eje horizontal, eliminé laVer
parte del nombre.Entonces ahora tiene una vista de envoltura que debería alinear vertical y horizontalmente su contenido y apilarlo a lo largo del eje x. Luego, simplemente coloco dos
View
componentes invisibles en el lado izquierdo y derecho delText
componente para hacer el relleno.Me gusta esto:
Y esto:
Entonces obtienes lo que creo que buscabas.
FUTURAS MEJORAS
Ahora, si desea apilar varias áreas de texto dentro de las vistas azul y naranja, puede hacer algo como esto:
Dónde
textWrap
tiene este estilo:¡Espero que esto ayude!
fuente
flexDirection: row
fue porque (si tengo esto en mi cabeza)flexDirection
dicta la dirección en la que se apilarán los 'hijos' de ese padre. Ahora quería que el texto fuera el hijo del medio en un padre que apila a los hijos en una fila y ocupa el 80% del ancho de los padres (algo así como la segunda foto). ¿Podría actualizar un poco la respuesta para reflejar eso? Estoy dispuesto a aceptar esto como la respuesta.flexDirection: "row"
era el meollo de mi problema, intenté todo lo demás sin suerte. Cambie suflexDirection
acolumn
y el texto dentro de él se ajustará normalmente.Otra solución que encontré para este problema es envolver el texto dentro de una vista. También configure el estilo de la Vista para que sea flexible: 1.
fuente
Quería agregar que estaba teniendo el mismo problema y flexWrap, flex: 1 (en los componentes de texto), nada de flex funcionaba para mí.
Eventualmente, configuré el ancho del contenedor de mis componentes de texto al ancho del dispositivo y el texto comenzó a ajustarse.
const win = Dimensions.get('window');
fuente
¡{flex: aNumber} es todo lo que necesita!
Simplemente configure 'flex' en un número que se adapte a sus necesidades. Y luego el texto se ajustará.
fuente
En la versión 0.62.2 de React Native, simplemente puse "flex-shrink: 1" en el contenedor de mi "Texto", pero recuerde la fila flex-direction: en la Vista del contenedor. Gracias chicos por la ayuda.
Mi código:
fuente
mi solución a continuación:
estilo:
resultado: [
fuente
fuente