O código a seguir pode ser encontrado neste exemplo ao vivo
Eu tenho o seguinte elemento nativo reac:
'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);
com os seguintes 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'
}
});
Isso resulta na seguinte tela:
Como posso impedir que o texto saia da tela e mantê-lo confinado no meio da tela com uma largura de, por exemplo, 80% do pai.
Não acho que devo usar width
porque estarei executando em MUITAS telas diferentes de dispositivos móveis e quero que seja dinâmico, então acho que devo confiar totalmente flexbox
.
(Essa foi a razão inicial pela qual eu tive flex: 0.8
dentro do descriptionContainerHor
.
O que eu quero alcançar é algo assim:
Obrigado!
fonte
flexShrink: 1
aplicado à visão pai também ajudará.Este é um bug conhecido .
flexWrap: 'wrap'
não funcionou para mim, mas esta solução parece funcionar para a maioria das pessoasCódigo
Estilos
fonte
A solução para esse problema é
flexShrink: 1
.Dependendo de sua configuração, você também pode precisar adicionar
flexShrink: 1
ao<View>
pai de também, para fazer isso funcionar, então brinque com isso e você vai conseguir.A solução foi descoberta por Adam Pietrasiak em esta discussão.
fonte
você só precisa ter um invólucro para seu
<Text>
com flex como abaixo;fonte
flex: 1
é tudo que você precisa.Funciona se você remover
flexDirection: row
dedescriptionContainerVer
edescriptionContainerVer2
respectivamente.ATUALIZAÇÃO (ver comentários)
Fiz algumas alterações para alcançar o que acho que você quer. Em primeiro lugar, removi o
descriptionContainerHor
componente. Em seguida, defini asflexDirection
visualizações verticais comorow
e adicioneialignItems: 'center'
ejustifyContent: 'center'
. Uma vez que as vistas verticais estão agora empilhadas ao longo do eixo horizontal, removi oVer
parte do nome.Portanto, agora você tem uma visualização de wrapper que deve alinhar vertical e horizontalmente seu conteúdo e empilhá-lo ao longo do eixo x. Em seguida, simplesmente coloco dois
View
componentes invisíveis no lado esquerdo e direito doText
componente para fazer o preenchimento.Como isso:
E isto:
Então você consegue o que eu acredito que você estava procurando.
OUTRAS MELHORIAS
Agora, se você gostaria de empilhar várias áreas de texto dentro das visualizações azul e laranja, você pode fazer algo assim:
Onde
textWrap
é estilizado assim:Espero que isto ajude!
fonte
flexDirection: row
foi porque (se é que estou bem na minha cabeça)flexDirection
dita a direção em que os 'filhos' desse pai serão empilhados. Agora eu queria que o texto fosse o filho do meio em um pai que empilha os filhos em uma fileira e ocupasse 80% da largura dos pais (algo como a segunda foto). Você poderia atualizar um pouco a resposta para refletir isso? Estou disposto a aceitar isso como a resposta.flexDirection: "row"
foi o cerne do meu problema, tentei de tudo sem sorte. Altere seuflexDirection
paracolumn
e o texto dentro dele será quebrado normalmente.Outra solução que encontrei para esse problema é envolver o Texto dentro de uma Visualização. Defina também o estilo da vista para flex: 1.
fonte
Queria acrescentar que estava tendo o mesmo problema e flexWrap, flex: 1 (nos componentes de texto), nada do flex estava funcionando para mim.
Eventualmente, eu defini a largura do invólucro dos meus componentes de texto para a largura do dispositivo e o texto começou a ser agrupado.
const win = Dimensions.get('window');
fonte
{flex: aNumber} é tudo que você precisa!
Basta definir 'flex' para um número adequado para você. E então o texto será quebrado.
fonte
Na versão 0.62.2 do React Native, eu apenas coloquei "flex-shrink: 1" no Container do meu "Text", mas lembre-se do flex-direction: row na visualização do container. Obrigado a vocês pela ajuda.
Meu código:
fonte
minha solução abaixo:
estilo:
resultado: [
fonte
fonte