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.
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.
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),
},
};
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 .
ScaledSheet
no pacote, que é uma versão dimensionada automaticamente do StyleSheet
. Você pode encontrá-lo aqui: react-native-size-matter .
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.
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.
<Text style={[s.f5, s.pa2, s.tc]}>
Something
</Text>
Expansão:
f5
é sempre o seu tamanho de fonte basepa2
fornece padding relativo ao seu tamanho de fonte base.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}
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.
react-native-text
.
adjustsFontSizeToFit
e numberOfLines
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>
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.
<Text
adjustsFontSizeToFit
style={styles.valueField}>{value}
</Text>
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',
},
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
});
Por que não usar PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);
, é igual às pd
unidades do Android.
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 .
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
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.
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.
Text.defaultProps.allowFontScaling=false