ReactNative: comment centrer le texte?

212

Comment centrer le texte dans ReactNative à la fois horizontalement et verticalement?

J'ai un exemple d'application dans rnplay.org où justificationContent = "centre" et alignItems = "centre" ne fonctionne pas: https://rnplay.org/apps/AoxNKQ

Le texte doit être centré. Et pourquoi y a-t-il une marge en haut entre le texte (jaune) et le conteneur parent?

Code:

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  Image,
  View,
} = React;

var SampleApp = React.createClass({
  render: function() {
    return (
            <View style={styles.container}>
                <View style={styles.topBox}>
                    <Text style={styles.headline}>lorem ipsum{'\n'}ipsum lorem lorem</Text>

                </View>
                <View style={styles.otherContainer}>
                </View>
            </View>
    );
  }
});

var styles = StyleSheet.create({

    container: {
        flex: 1,
        flexDirection: 'column',
        backgroundColor: 'red',
        justifyContent: 'center',
        alignItems: 'center',
    },

    topBox: {
        flex: 1,
        flexDirection: 'row',
        backgroundColor: 'lightgray',
        justifyContent: 'center',
        alignItems: 'center',
    },
    headline: {
        fontWeight: 'bold',
        fontSize: 18,
    marginTop: 0,
        width: 200,
        height: 80,
    backgroundColor: 'yellow',
        justifyContent: 'center',
        alignItems: 'center',
    },

  otherContainer: {
        flex: 4,
        justifyContent: 'center',
        alignItems: 'center',
    backgroundColor: 'green',
    },


});

AppRegistry.registerComponent('SampleApp', () => SampleApp);

module.exports = SampleApp;
itinance
la source
Comme ceci: rnplay.org/apps/1hbnSA ?
Cherniv
ce n'est pas centré horizontalement
itinance
1
ok, donc ceci: rnplay.org/apps/1hbnSA , mis à jour
Cherniv
WAAAA ... textAlign? je savais que ce serait quelque chose de vraiment stupide .... vous devriez poster ceci comme une réponse
itinance

Réponses:

356

De headline'style supprimer height, justifyContentet alignItems. Il centrera le texte verticalement. Ajoutez textAlign: 'center'et il centrera le texte horizontalement.

  headline: {
    textAlign: 'center', // <-- the magic
    fontWeight: 'bold',
    fontSize: 18,
    marginTop: 0,
    width: 200,
    backgroundColor: 'yellow',
  }
Tcherniv
la source
16
Ne fonctionne pas avec un widthsauf si vous l'enveloppez dans un <View>avecjustifyContent: 'center', alignItems: 'center',
Ryan Walker
59

Déjà répondu, mais j'aimerais ajouter un peu plus sur le sujet et les différentes façons de le faire en fonction de votre cas d'utilisation.

Vous pouvez ajouter adjustsFontSizeToFit={true}(actuellement non documenté) au Textcomposant pour ajuster automatiquement la taille à l'intérieur d'un nœud parent.

  <Text adjustsFontSizeToFit={true} numberOfLines={1}>Hiiiz</Text>

Vous pouvez également ajouter les éléments suivants dans votre composant texte:

<Text style={{textAlignVertical: "center",textAlign: "center",}}>Hiiiz</Text>

Ou vous pouvez ajouter ce qui suit dans le parent du composant Texte:

<View style={{flex:1,justifyContent: "center",alignItems: "center"}}>
     <Text>Hiiiz</Text>
</View>

ou les deux

 <View style={{flex:1,justifyContent: "center",alignItems: "center"}}>
     <Text style={{textAlignVertical: "center",textAlign: "center",}}>Hiiiz</Text>
</View>

ou les trois

 <View style={{flex:1,justifyContent: "center",alignItems: "center"}}>
     <Text adjustsFontSizeToFit={true} 
           numberOfLines={1} 
           style={{textAlignVertical: "center",textAlign: "center",}}>Hiiiz</Text>
</View>

Tout dépend de ce que vous faites. Vous pouvez également consulter mon article de blog complet sur le sujet

https://medium.com/@vygaio/how-to-auto-adjust-text-font-size-to-fit-into-a-nodes-width-in-react-native-9f7d1d68305b

Garrettmac
la source
cela devrait être prévu: <Text style = {{textAlignVertical: "center", textAlign: "center",}}> Hiiiz </Text>
Tushar Pandey
mec tu m'as sauvé 1,5 heure. J'essayais de faire la même chose mais je n'ai pas pu jusqu'à cette réponse en tant que:, en tant textAlignVertical: "center", textAlign: "center" que <Text /> Style de composant.
ganeshdeshmukh
textAlignVertical est uniquement Android. Aucune de ces solutions n'aligne mon texte verticalement, seulement horizontalement.
sudo
14

Définissez ces styles sur le composant image: {textAlignVertical: "center", textAlign: "center"}

mocanSergiu666
la source
13
textAlignVertical: "center"

est la vraie magie.

Muzammil
la source
9

ceci est un exemple d' alignement horizontal et vertical simultanément

<View style={{width: 200, flexDirection: 'row',alignItems: 'center'}}>
     <Text style={{width: '100%',textAlign: 'center'}} />
</View>
Bashirpour
la source
Merci pour le conseil que les styles en ligne doivent être placés entre {{accolades doubles}}.
MarkHu
6

Alignement central horizontal et vertical

<View style={{flex: 1, justifyContent: 'center',alignItems: 'center'}}>
     <Text> Example Test </Text>
</View>
Bashirpour
la source
Seule solution qui a fonctionné pour moi en termes de centrage de <Text> à l'intérieur d'une <View> non seulement horizontalement, mais aussi verticalement. Je vous remercie!
RuntimeError
4

Vous pouvez utiliser une alignSelfpropriété sur le composant Texte

{ alignSelf : "center" }
Meenu Negi
la source
4

Partout où vous avez un Textcomposant dans votre page, il vous suffit de définir le style du Textcomposant.

 <Text style={{ textAlign: 'center' }}> Text here </Text>

vous n'avez pas besoin d'ajouter d'autre propriété de style, c'est une magie spectaculaire qui vous mettra du texte au centre de votre interface utilisateur.

Hardik Virani
la source
2

Ajout simple

textAlign: "center"

dans votre feuille de style, c'est tout. J'espère que cela vous aidera.

modifier: "centre"

Raghib Arshi
la source
2

La propriété suivante peut être utilisée: {{alignItems: 'center'}}

<View style={{alignItems: 'center'}}>
 <Text>Hello im centered text{this.props.name}!</Text>
</View>
Omar bakhsh
la source
1
Même si cela peut être la solution à la question, veuillez ajouter quelques explications afin que nous puissions tous apprendre.
harmonica141
S'il vous plaît, améliorez-le car vous utilisez deux astérisques pour faire circuler la correction principale mais ce n'est pas clair et l'autre partie est confuse
Frederiko Cesar
2

utilisé

textalign: centre

à la vue

Sanjib Suna
la source
2

Définir dans la vue parent

justifyContent:center

et en vue enfant alignSelf: centre

Sanson Jib
la source
Les clés doivent être dans un étui à chameaux justifyContentetalignSelf
Siddharth
1

En plus des cas d'utilisation mentionnés dans les autres réponses:

Pour centrer le texte dans le cas d'utilisation spécifique d'un BottomTabNavigator , n'oubliez pas de définir showIcon sur false (même si vous n'avez pas d'icônes dans TabNavigator). Sinon, le texte sera poussé vers le bas de l'onglet.

Par exemple:

const TabNavigator = createBottomTabNavigator({
  Home: HomeScreen,
  Settings: SettingsScreen
}, {
  tabBarOptions: {
    activeTintColor: 'white',
    inactiveTintColor: 'black',
    showIcon: false, //do this
    labelStyle: {
      fontSize: 20,
      textAlign: 'center',
    },
    tabStyle: {
      backgroundColor: 'grey',
      marginTop: 0,
      textAlign: 'center',
      justifyContent: 'center',
      textAlignVertical: "center"
    }
  }
Gunnar Karlsson
la source
0
const styles = StyleSheet.create({
        navigationView: {
        height: 44,
        width: '100%',
        backgroundColor:'darkgray',
        justifyContent: 'center', 
        alignItems: 'center' 
    },
    titleText: {
        fontSize: 20,
        fontWeight: 'bold',
        color: 'white',
        textAlign: 'center',
    },
})


render() {
    return (
        <View style = { styles.navigationView }>
            <Text style = { styles.titleText } > Title name here </Text>
        </View>
    )

}
Giang
la source
0

ajouter d'abord dans la vue parent flex: 1, justificationContenu: 'centre', alignItems: 'centre'

puis dans le texte, ajoutez textAlign: 'center'


la source