Gostaria de perguntar como reage a lidar com nativos ou como fazer a fonte responsiva. Por exemplo, no iphone 4s, tenho fontSize: 14, enquanto no iphone 6, tenho fontSize: 18.
ios
reactjs
react-native
Sydney Loteria
fonte
fonte
Text.defaultProps.allowFontScaling=false
Respostas:
Você pode usar PixelRatio
por exemplo:
var React = require('react-native'); var {StyleSheet, PixelRatio} = React; var FONT_BACK_LABEL = 18; if (PixelRatio.get() <= 2) { FONT_BACK_LABEL = 14; } var styles = StyleSheet.create({ label: { fontSize: FONT_BACK_LABEL } });
Editar:
Outro exemplo:
import { Dimensions, Platform, PixelRatio } from 'react-native'; const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT, } = Dimensions.get('window'); // based on iphone 5s's scale const scale = SCREEN_WIDTH / 320; export function normalize(size) { const newSize = size * scale if (Platform.OS === 'ios') { return Math.round(PixelRatio.roundToNearestPixel(newSize)) } else { return Math.round(PixelRatio.roundToNearestPixel(newSize)) - 2 } }
Uso:
fontSize: normalize(24)
você pode ir um passo além, permitindo que tamanhos sejam usados em todos os
<Text />
componentes por tamanhos predefinidos.Exemplo:
const styles = { mini: { fontSize: normalize(12), }, small: { fontSize: normalize(15), }, medium: { fontSize: normalize(17), }, large: { fontSize: normalize(20), }, xlarge: { fontSize: normalize(24), }, };
fonte
Usamos funções de utilitários de escalonamento simples e diretas que escrevemos:
import { Dimensions } from 'react-native'; const { width, height } = Dimensions.get('window'); //Guideline sizes are based on standard ~5" screen mobile device const guidelineBaseWidth = 350; const guidelineBaseHeight = 680; const scale = size => width / guidelineBaseWidth * size; const verticalScale = size => height / guidelineBaseHeight * size; const moderateScale = (size, factor = 0.5) => size + ( scale(size) - size ) * factor; export {scale, verticalScale, moderateScale};
Economiza algum tempo fazendo muitos ifs. Você pode ler mais sobre isso no meu blog .
Edit: Achei que seria útil extrair essas funções para seu próprio pacote npm, também incluído
ScaledSheet
no pacote, que é uma versão dimensionada automaticamente doStyleSheet
. Você pode encontrá-lo aqui: react-native-size-matter .fonte
Como as unidades responsivas não estão disponíveis no react-native no momento, eu diria que sua melhor aposta seria detectar o tamanho da tela e então usar isso para inferir o tipo de dispositivo e definir o fontSize condicionalmente.
Você pode escrever um módulo como:
function fontSizer (screenWidth) { if(screenWidth > 400){ return 18; }else if(screenWidth > 250){ return 14; }else { return 12; } }
Você só precisa verificar qual é a largura e a altura padrão de cada dispositivo. Se a largura e a altura forem invertidas quando o dispositivo mudar de orientação, você poderá usar a proporção de aspecto ou apenas descobrir a menor das duas dimensões para descobrir a largura.
Este módulo ou este pode ajudá-lo a encontrar dimensões ou tipo de dispositivo.
fonte
npm install
Dê uma olhada na biblioteca que escrevi: https://github.com/tachyons-css/react-native-style-tachyons
Ele permite que você especifique um root-fontSize (
rem
) no início, que você pode tornar dependente dePixelRatio
ou de outras características do dispositivo.Então você obtém estilos relativos ao seu
rem
, não apenas fontSize, mas também preenchimentos, etc.Expansão:
f5
é sempre o seu tamanho de fonte basepa2
fornece padding relativo ao seu tamanho de fonte base.fonte
Eu simplesmente uso a proporção do tamanho da tela, o que funciona bem para mim.
const { width, height } = Dimensions.get('window'); // Use iPhone6 as base size which is 375 x 667 const baseWidth = 375; const baseHeight = 667; const scaleWidth = width / baseWidth; const scaleHeight = height / baseHeight; const scale = Math.min(scaleWidth, scaleHeight); export const scaledSize = (size) => Math.ceil((size * scale));
Teste
const size = { small: scaledSize(25), oneThird: scaledSize(125), fullScreen: scaledSize(375), }; console.log(size); // iPhone 5s {small: 22, oneThird: 107, fullScreen: 320} // iPhone 6s {small: 25, oneThird: 125, fullScreen: 375} // iPhone 6s Plus {small: 28, oneThird: 138, fullScreen: 414}
fonte
Consegui superar isso fazendo o seguinte.
Escolha o tamanho da fonte que você deseja para a visualização atual que você tem (certifique-se de que parece bom para o dispositivo atual que você está usando no simulador).
import { Dimensions } from 'react-native'
e definir a largura fora do componente como:let width = Dimensions.get('window').width;
Agora console.log (largura) e anote. Se o tamanho da sua fonte de boa aparência for 15 e a largura 360, por exemplo, pegue 360 e divida por 15 (= 24). Este será o valor importante que se ajustará aos diferentes tamanhos.
Use este número em seu objeto de estilos assim:
textFontSize: { fontSize = width / 24 },...
Agora você tem um fontSize responsivo.
fonte
react-native-text
.adjustsFontSizeToFit
enumberOfLines
funciona para mim. Eles ajustam e-mails longos em 1 linha.<View> <Text numberOfLines={1} adjustsFontSizeToFit style={{textAlign:'center',fontSize:30}} > {this.props.email} </Text> </View>
fonte
Podemos usar layout flexível e usar adjustsFontSizeToFit = {true} para tamanhos de fonte responsivos. E o texto se ajustaria de acordo com o tamanho do contêiner.
Mas em estilos você também precisa colocar um tamanho de fonte, só então o ajuste de FontSizeToFit funcionará.
valueField: { flex: 3, fontSize: 48, marginBottom: 5, color: '#00A398', },
fonte
Recentemente, encontrei este problema e acabei usando react-native-extended-stylesheet
Você pode definir o
rem
valor e as condições adicionais de tamanho com base no tamanho da tela. De acordo com os documentos:// component const styles = EStyleSheet.create({ text: { fontSize: '1.5rem', marginHorizontal: '2rem' } }); // app entry let {height, width} = Dimensions.get('window'); EStyleSheet.build({ $rem: width > 340 ? 18 : 16 });
fonte
Por que não usar
PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);
, é igual àspd
unidades do Android.fonte
import { Dimensions } from 'react-native'; const { width, fontScale } = Dimensions.get("window"); const styles = StyleSheet.create({ fontSize: idleFontSize / fontScale, });
fontScale
obtenha escala de acordo com seu dispositivo .fonte
Preciso usar desta forma Eu usei este e está funcionando bem.
react -native-responsive-screen npm install react-native-responsive-screen --save
Assim como eu tenho um dispositivo 1080x1920
The vertical number we calculate from height **hp** height:200 200/1920*100 = 10.41% - height:hp("10.41%") The Horizontal number we calculate from width **wp** width:200 200/1080*100 = 18.51% - Width:wp("18.51%")
Está funcionando para todos os dispositivos
fonte
Uma abordagem ligeiramente diferente funcionou para mim: -
const normalize = (size: number): number => { const scale = screenWidth / 320; const newSize = size * scale; let calculatedSize = Math.round(PixelRatio.roundToNearestPixel(newSize)) if (PixelRatio.get() < 3) return calculatedSize - 0.5 return calculatedSize };
Consulte Pixel Ratio, pois isso permite que você configure melhor a função com base na densidade do dispositivo.
fonte
Você pode usar algo assim.
var {altura, largura} = Dimensions.get ('janela'); var textFontSize = largura * 0,03;
inputText: { color : TEXT_COLOR_PRIMARY, width: '80%', fontSize: textFontSize }
Espero que isso ajude sem instalar nenhuma biblioteca de terceiros.
fonte