Le code suivant peut être trouvé dans cet exemple en direct
J'ai l'élément natif de réaction suivant:
'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);
avec les styles suivants:
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'
}
});
Cela se traduit par l'écran suivant:
Comment puis-je empêcher le texte de sortir de l'écran et le garder confiné au milieu de l'écran avec une largeur de soit 80% du parent.
Je ne pense pas que je devrais l'utiliser width
parce que je vais l'exécuter sur BEAUCOUP d'écrans mobiles différents et je veux que ce soit dynamique, donc je pense que je devrais compter totalement sur flexbox
.
(C'était la raison initiale pour laquelle j'avais flex: 0.8
dans le descriptionContainerHor
.
Ce que je veux réaliser est quelque chose comme ceci:
Je vous remercie!
la source
flexShrink: 1
appliqué à la vue parent aidera également.C'est un bogue connu .
flexWrap: 'wrap'
n'a pas fonctionné pour moi mais cette solution semble fonctionner pour la plupart des gensCode
modes
la source
La solution à ce problème est
flexShrink: 1
.En fonction de votre configuration, vous devrez peut-être également ajouter
flexShrink: 1
le<View>
parent du parent pour que cela fonctionne, alors jouez avec cela et vous y arriverez.La solution a été découverte par Adam Pietrasiak dans ce fil.
la source
vous avez juste besoin d'un wrapper pour votre
<Text>
avec flex comme ci-dessous;la source
flex: 1
c'est tout ce dont vous avez besoin.Cela fonctionne si vous supprimez
flexDirection: row
dedescriptionContainerVer
etdescriptionContainerVer2
respectivement.MISE À JOUR (voir commentaires)
J'ai fait quelques changements pour réaliser ce que je pense que vous recherchez. Tout d'abord, j'ai supprimé le
descriptionContainerHor
composant. Ensuite, j'ai défini lesflexDirection
vues verticales surrow
et ajoutéalignItems: 'center'
etjustifyContent: 'center'
. Puisque les vues verticales sont maintenant en fait empilées le long de l'axe horizontal, j'ai supprimé laVer
pièce du nom.Vous avez donc maintenant une vue wrapper qui doit aligner verticalement et horizontalement son contenu et l'empiler le long de l'axe x. Je place ensuite simplement deux
View
composants invisibles sur le côté gauche et droit duText
composant pour faire le rembourrage.Comme ça:
Et ça:
Ensuite, vous obtenez ce que je crois que vous recherchiez.
AUTRES AMÉLIORATIONS
Maintenant, si vous souhaitez empiler plusieurs zones de texte dans les vues bleue et orange, vous pouvez faire quelque chose comme ceci:
Où
textWrap
est conçu comme ceci:J'espère que cela t'aides!
la source
flexDirection: row
était parce que (si j'ai ce droit dans ma tête)flexDirection
dicte la direction dans laquelle les «enfants» de ce parent seront empilés. Maintenant, je voulais que le texte soit l' enfant du milieu chez un parent qui empile les enfants dans une rangée et occupe les 80% de la largeur des parents (quelque chose comme la deuxième photo). Pourriez-vous mettre à jour un peu la réponse pour refléter cela? Je suis prêt à accepter ceci comme réponse.flexDirection: "row"
était au cœur de mon problème, j'ai tout essayé sans chance. Changez votreflexDirection
encolumn
et le texte à l'intérieur sera enveloppé normalement.Une autre solution que j'ai trouvée à ce problème consiste à envelopper le texte dans une vue. Définissez également le style de la vue sur flex: 1.
la source
Je voulais ajouter que j'avais le même problème et flexWrap, flex: 1 (dans les composants de texte), rien de flex ne fonctionnait pour moi.
Finalement, j'ai défini la largeur du wrapper de mes composants de texte sur la largeur de l'appareil et le texte a commencé à s'habiller.
const win = Dimensions.get('window');
la source
{flex: aNumber} est tout ce dont vous avez besoin!
Réglez simplement «flex» sur un nombre qui vous convient. Et puis le texte s'enroulera.
la source
Dans la version 0.62.2 de React Native, je viens de mettre "flex-shrink: 1" dans Container de mon "Text", mais souviens-toi du flex-direction: row dans View of container. Merci les gars pour l'aide.
Mon code:
la source
ma solution ci-dessous:
style:
résultat: [
la source
la source