ReactNative: como centralizar o texto?

212

Como centralizar o texto no ReactNative tanto na horizontal quanto na vertical?

Eu tenho um exemplo de aplicativo em rnplay.org, em que justifyContent = "center" e alignItems = "center" não está funcionando: https://rnplay.org/apps/AoxNKQ

O texto deve estar centralizado. E por que existe uma margem na parte superior entre o texto (amarelo) e o contêiner pai?

Código:

'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
fonte
Assim: rnplay.org/apps/1hbnSA ?
Cherniv
isso não é horizontal centrado
itinance
1
ok, então isso: rnplay.org/apps/1hbnSA , atualizado
Cherniv 01-01
WAAAA ... textAlign? Eu sabia que ia algo realmente estúpido .... você deve postar isso como uma resposta
itinance

Respostas:

356

De headline'remove estilo height, justifyContente alignItems. Centralizará o texto verticalmente. Adicione textAlign: 'center'e ele centralizará o texto horizontalmente.

  headline: {
    textAlign: 'center', // <-- the magic
    fontWeight: 'bold',
    fontSize: 18,
    marginTop: 0,
    width: 200,
    backgroundColor: 'yellow',
  }
Cherniv
fonte
16
Não funciona com um widtha menos que você envolvê-la em um <View>comjustifyContent: 'center', alignItems: 'center',
Ryan Walker
59

Já respondi, mas gostaria de adicionar um pouco mais sobre o tópico e diferentes maneiras de fazer isso, dependendo do seu caso de uso.

Você pode adicionar adjustsFontSizeToFit={true}(atualmente não documentado) ao TextComponente para ajustar automaticamente o tamanho dentro de um nó pai.

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

Você também pode adicionar o seguinte no seu componente de texto:

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

Ou você pode adicionar o seguinte ao pai do componente Text:

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

ou ambos

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

ou todos os três

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

Tudo depende do que você está fazendo. Você também pode conferir minha postagem completa no blog sobre o tópico

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

garrettmac
fonte
isto deve ser esperado: <Text style = {{textAlignVertical: "center", textAlign: "center",}}> Hiiiz </Text>
Tushar Pandey
Cara, você salvou minhas 1,5 horas. Eu estava tentando fazer o mesmo, mas não consegui até esta resposta como:, textAlignVertical: "center", textAlign: "center" como <Text /> Component Style.
ganeshdeshmukh
textAlignVertical é apenas Android. Nenhuma dessas soluções está alinhando meu texto verticalmente, apenas horizontalmente.
sudo
14

Defina esses estilos para o componente de imagem: {textAlignVertical: "center", textAlign: "center"}

mocanSergiu666
fonte
13
textAlignVertical: "center"

é a verdadeira magia.

Muzammil
fonte
9

este é um exemplo para alinhamento horizontal e vertical simultaneamente

<View style={{width: 200, flexDirection: 'row',alignItems: 'center'}}>
     <Text style={{width: '100%',textAlign: 'center'}} />
</View>
Bashirpour
fonte
Obrigado pela dica de que os estilos em linha devem ser colocados em {{double-curly-braces}}.
MarkHu 25/05
6

Alinhamento central horizontal e vertical

<View style={{flex: 1, justifyContent: 'center',alignItems: 'center'}}>
     <Text> Example Test </Text>
</View>
Bashirpour
fonte
Única solução que funcionou para mim em termos de centralizar <Text> dentro de um <View> não apenas horizontalmente, mas também verticalmente. Obrigado!
RuntimeError
4

Você pode usar a alignSelfpropriedade no componente Texto

{ alignSelf : "center" }
Meenu Negi
fonte
4

Onde quer que você tenha um Textcomponente em sua página, basta definir o estilo do Textcomponente.

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

você não precisa adicionar nenhuma outra propriedade de estilo; isso é uma mágica espetacular, pois você definirá o texto no centro da sua interface do usuário.

Hardik Virani
fonte
2

Adição simples

textAlign: "center"

no seu styleSheet, é isso. Espero que isso ajude.

editar: "centro"

Raghib Arshi
fonte
2

A seguinte propriedade pode ser usada: {{alignItems: 'center'}}

<View style={{alignItems: 'center'}}>
 <Text>Hello im centered text{this.props.name}!</Text>
</View>
Omar bakhsh
fonte
1
Mesmo que essa seja a solução para a pergunta, adicione mais explicações para que todos possamos aprender.
harmonica141
Por favor, melhorá-lo porque você está usando dois asteriscos para circular a correção principal, mas não está claro e a outra parte é confundir
Frederiko Cesar
2

usava

textalign: center

na vista

Sanjib Suna
fonte
2

Definir na visualização principal

justifyContent:center

e na visão infantil alignSelf: center

Sanson Jib
fonte
As chaves devem estar em estojo de camelo justifyContentealignSelf
Siddharth
1

Além dos casos de uso mencionados nas outras respostas:

Para centralizar o texto no caso de uso específico de um BottomTabNavigator , lembre-se de definir showIcon como false (mesmo se você não tiver ícones no TabNavigator). Caso contrário, o texto será empurrado para a parte inferior da guia.

Por exemplo:

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
fonte
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
fonte
0

primeiro adicionar na visualização pai flex: 1, justifyContent: 'center', alignItems: 'center'

em seguida, no texto, adicione textAlign: 'center'


fonte