React Native Responsive Font Size

91

Me gustaría preguntar cómo reacciona el manejo nativo o la fuente receptiva. Por ejemplo, en el iphone 4s tengo fontSize: 14, mientras que en el iphone 6 tengo fontSize: 18.

Lotería de Sydney
fuente
19
Si alguien está buscando una forma de deshabilitar completamente el escalado de fuentes, useText.defaultProps.allowFontScaling=false
CoderDave
1
@CoderDave ¡esto es genial!
Abdo
En caso de que desee un tamaño de fuente relativo basado en el tamaño de la pantalla en lugar del tamaño de fuente exacto, puede probar npmjs.com/package/react-native-responsive-dimensions , automáticamente cambiará el tamaño de sus fuentes según el tamaño de la pantalla del dispositivo
Dani Akash

Respuestas:

97

Puedes usar PixelRatio

por ejemplo:

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:

Otro ejemplo:

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)

puede ir un paso más allá al permitir que se usen tamaños en cada <Text />componente por tamaño predefinido.

Ejemplo:

const styles = {
  mini: {
    fontSize: normalize(12),
  },
  small: {
    fontSize: normalize(15),
  },
  medium: {
    fontSize: normalize(17),
  },
  large: {
    fontSize: normalize(20),
  },
  xlarge: {
    fontSize: normalize(24),
  },
};
chinloong
fuente
22
¿Dónde hiciste uso de tu escala constante aquí?
Jan Franz Palngipang
2
Esto no parece hacer nada. mini siempre === 12
A.com
14
¿Por qué estás restando 2 para dispositivos que no son ios?
Parth Tamane
51

Usamos funciones de utilidad de escalado simples y directas que escribimos:

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};

Le ahorra algo de tiempo haciendo muchos si. Puedes leer más sobre esto en la publicación de mi blog .


Editar: pensé que podría ser útil extraer estas funciones a su propio paquete npm, también las incluí ScaledSheeten el paquete, que es una versión escalada automáticamente de StyleSheet. Puede encontrarlo aquí: react-native-size-matter .

nirsky
fuente
Gracias, ¿cuál es el mejor escenario para usar esta utilidad? Me refiero a ¿dónde usar scale, verticaleScale y moderadaScale?
Pir Shukarullah Shah
4
Yo uso escala moderada en casi todo lo que necesita escalamiento, como tamaño de fuente, márgenes, imagen y tamaño Svg (para el diseño uso flex) porque la escala imo no debería ser lineal, pero eso es una cuestión de preferencia personal. Si desea lograr un resultado lineal, use principalmente escala y use verticalScale en cosas como alturas de contenedores.
nirsky
16

Debido a que las unidades receptivas no están disponibles en react-native en este momento, diría que su mejor opción sería detectar el tamaño de la pantalla y luego usarlo para inferir el tipo de dispositivo y establecer fontSize condicionalmente.

Podrías escribir un módulo como:

function fontSizer (screenWidth) {
  if(screenWidth > 400){
    return 18;
  }else if(screenWidth > 250){
    return 14;
  }else { 
    return 12;
  }
}

Solo necesitará buscar cuál es el ancho y alto predeterminados para cada dispositivo. Si el ancho y el alto se invierten cuando el dispositivo cambia de orientación, es posible que pueda usar la relación de aspecto en su lugar o simplemente calcular la menor de las dos dimensiones para calcular el ancho.

Este módulo o este puede ayudarlo a encontrar las dimensiones o el tipo de dispositivo.

Isaac enojado
fuente
He instalado react-native-device pero me da un error de "No se puede resolver el módulo Dimension" cuando ejecuto la aplicación
Sydney Loteria
Parece que necesita asegurarse de que está utilizando la versión correcta de RN para el módulo
Isaac Madwed
Estoy usando la última versión de React Native :) ¿Creo que actualmente no es compatible?
Sydney Loteria
Posiblemente ... Quizás intente eliminar su carpeta node_modules y vuelva anpm install
Isaac Madwed
6

Eche un vistazo a la biblioteca que escribí: https://github.com/tachyons-css/react-native-style-tachyons

Le permite especificar un root-fontSize ( rem) al inicio, que puede hacer que dependa de sus características PixelRatioo de otras características del dispositivo.

Luego obtienes estilos relativos a tu rem, no solo fontSize, sino también paddings, etc.

<Text style={[s.f5, s.pa2, s.tc]}>
     Something
</Text>

Ampliación:

  • f5es siempre tu tamaño de fuente base
  • pa2 le da relleno en relación con su tamaño de fuente base.
Fabián Zeindl
fuente
5

Simplemente utilizo la proporción del tamaño de la pantalla, que funciona bien para mí.

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));

Prueba

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}
shentaoy
fuente
¿Significa esto que tienes que usar el simulador de iPhone 6 y, según su apariencia, se verá bien en otros dispositivos?
Walter Monecke
@WalterMonecke en mi caso sí. También puede adaptarse para usar otro simulador como base.
shentaoy
4

adjustsFontSizeToFity numberOfLinestrabaja para mi. Ajustan el correo electrónico largo en una línea.

<View>
  <Text
    numberOfLines={1}
    adjustsFontSizeToFit
    style={{textAlign:'center',fontSize:30}}
  >
    {this.props.email}
  </Text>
</View>
Gundam Meister
fuente
10
de acuerdo con la documentación, 'ajustaFontSizeToFit' solo se aplica a iOS
mdehghani
Esto no funciona para Android
Samantha Withanage
3

Me las arreglé para superar esto haciendo lo siguiente.

  1. Elija el tamaño de fuente que desee para la vista actual que tiene (asegúrese de que se vea bien para el dispositivo actual que está utilizando en el simulador).

  2. import { Dimensions } from 'react-native' y defina el ancho fuera del componente así: let width = Dimensions.get('window').width;

  3. Ahora console.log (ancho) y anótalo. Si su tamaño de fuente atractivo es 15 y su ancho es 360, por ejemplo, tome 360 ​​y divida por 15 (= 24). Este será el valor importante que se ajustará a diferentes tamaños.

    Use este número en su objeto de estilos así: textFontSize: { fontSize = width / 24 },...

Ahora tienes un fontSize receptivo.

Walter Monecke
fuente
oye, ¿realmente funciona? f1 = ancho / (ancho / tamaño) esto no puede funcionar?
Elrond
1
Terminé usando react-native-text.
Walter Monecke
3

Podemos usar un diseño flexible y usar adjustsFontSizeToFit = {true} para tamaños de fuente receptivos. Y el texto se ajustaría de acuerdo con el tamaño del contenedor.

     <Text
    adjustsFontSizeToFit
    style={styles.valueField}>{value}
    </Text>

Pero en los estilos también debe poner un tamaño de fuente, solo entonces ajustará el tamaño de fuente para ajustar.

    valueField: {
    flex: 3,
    fontSize: 48,
    marginBottom: 5,
    color: '#00A398',
},
Payel Dutta
fuente
2

Recientemente me encontré con este problema y terminé usando react-native-extended-stylesheet

Puede establecer su remvalor y condiciones de tamaño adicionales según el tamaño de la pantalla. Según los 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
});
colakollektiv
fuente
2

Por qué no usarlo PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);, es lo mismo que las pdunidades en Android.

Ahmed Kamal
fuente
2
import { Dimensions } from 'react-native';

const { width, fontScale } = Dimensions.get("window");

const styles = StyleSheet.create({
    fontSize: idleFontSize / fontScale,
});

fontScaleObtenga escala según su dispositivo .

Paras Korat
fuente
fontscale solo devuelve 1 en el dispositivo virtual Android Emulator 4_WVGA_Nexus_S_API que estoy usando.
reggie3
0

Necesito usarlo de esta manera. He usado este y está funcionando bien.

react-native-responsive-screen npm install react-native-responsive-screen --save

Al igual que tengo un 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%")

Funciona para todos los dispositivos

Tushar Kumawat
fuente
0

Un enfoque ligeramente diferente funcionó para mí: -

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 la relación de píxeles, ya que esto le permite configurar mejor la función según la densidad del dispositivo.

Arpan Sharma
fuente
-3

Puedes usar algo como esto.

var {altura, ancho} = Dimensions.get ('ventana'); var textFontSize = ancho * 0.03;

inputText: {
    color : TEXT_COLOR_PRIMARY,
    width: '80%',
    fontSize: textFontSize
}

Espero que esto ayude sin instalar bibliotecas de terceros.

Guna Sekhar
fuente
1
y de donde vino 0.03?
David Noreña
¿Responderá?
Deepak Ganachari