¿Cómo deshabilitar el escalado de fuentes en la aplicación React Native para IOS y Android?

6 minutos de lectura

Avatar de usuario de AJA
AJA

La ampliación del tamaño de la fuente del dispositivo a veces se romperá (estilo inteligente).

  • Esta es una mala elección porque daña a los usuarios con problemas de visión y a los usuarios con manos temblorosas u otros problemas motores que dificultan la interacción con objetivos táctiles pequeños. Una mejor solución es arreglar su estilo para que los cambios de fuente no lo rompan. (Por ejemplo, no use alturas o anchos fijos).

    – Aarón Brager

    17 de agosto de 2018 a las 15:01

  • No siempre es el caso @AaronBrager, en un dispositivo pequeño es casi imposible “arreglar” su estilo para que se ajuste al texto en la misma fila. Entonces, a menos que no tenga mucho texto para ver en su pantalla, entonces sí, puede ser más considerado. Así que esto es totalmente opcional y no obligatorio. Lo que sea que se ajuste a tu necesidad, lo haces.

    – AJA

    19 de agosto de 2018 a las 11:45


  • No tiene que estar en la misma fila. Los usuarios que suben el tamaño de la fuente al máximo se alegran de tener un ajuste de texto incómodo.

    – Aarón Brager

    19 de agosto de 2018 a las 14:27

  • Bueno, en caso de que el propietario del proyecto no quiera que su aplicación se rompa así, puede usar esto. De lo contrario, pueden ignorar esto por completo y mantener la fuente en tamaño automático. De nuevo, esto es totalmente opcional. @AaronBrager

    – AJA

    19 de agosto de 2018 a las 14:39

avatar de usuario de levi
leví

Deshabilitar el escalado de fuentes puede dañar la accesibilidad de su aplicación, idealmente si desea limitar el escalado de aplicaciones que usan React native 0.58.0 y superior; utilizar el maxFontSizeMultiplier apuntalar en específico Text componentes

Sin embargo, si desea deshabilitar absolutamente la escala de fuentes en toda su aplicación, puede hacerlo configurando globalmente el allowFontScaling apuntalar en el defaultProps de Text.

Debe colocar estas líneas en su punto de entrada raíz (normalmente index.js) antes AppRegistry.registerComponent.

Para reaccionar nativo 0.56.0+

Text.defaultProps = Text.defaultProps || {};
Text.defaultProps.allowFontScaling = false;

Para versiones anteriores de React Native, solo debería necesitar la segunda línea, pero tener ambas no le hará daño. La primera línea sólo protege contra el Text componente que no tiene defaultProps que es el caso de React Native 0.56.0 y superior.

Agregue las líneas anteriores en el archivo de punto de entrada de su aplicación React Native (generalmente index.js, app.js o main.js) para aplicar este apoyo a todos Text componentes de su aplicación.

Este accesorio solo afectará Text componentes y es posible que desee aplicar los mismos cambios a TextInput que se puede hacer con un fragmento similar:

TextInput.defaultProps = TextInput.defaultProps || {};
TextInput.defaultProps.allowFontScaling = false;

También tenga en cuenta que algunos componentes no obedecerán la configuración de escala de fuente, por ejemplo: Alert, PickerIOS, DatePickerIOS, TabBarIOS, SegmentedControlIOS ya que todos estos están dibujados de forma nativa y no dependen del Text componente.

  • Hackish, pero brillante sin embargo. lo estoy usando

    –Kaiwen Huang

    18/09/2018 a las 10:35

  • @KiritModi Creo que Alert se representa de forma completamente nativa, así que supongo que no puede controlar cómo se representa el texto dentro del modal. En su lugar, necesitaría implementar su propio componente de alerta.

    – Levi

    23 de octubre de 2018 a las 2:25

  • En caso de que algunos de ustedes se pregunten dónde implementar esto, coloque el código anterior justo debajo de sus declaraciones de importación en ~/index.js. Asegúrese de importar también el Text componente en RN. Por cierto, estoy ejecutando RN 0.57.8.

    – Maestro de mezclas Mike

    16 de enero de 2019 a las 7:04

  • Text.defaultProps a veces puede no estar definido, por lo que es mejor usar: Text.defaultProps = Text.defaultProps || {}. Maneja ambos casos.

    – dphaener

    29/01/2019 a las 19:00


  • @dphaener el original buscado Text.defaultProps siendo indefinido.

    – Levi

    4 de febrero de 2019 a las 1:35

Avatar de usuario de AJA
AJA

Para React nativo 0.58+

Es preferible mantener la escala de fuente, pero puede limitarla usando Text new prop maxFontSizeMultiplier

Para React native 0.56+ use la respuesta de Levi

Text.defaultProps = Text.defaultProps || {};
Text.defaultProps.allowFontScaling = false;

Para React nativo 0.55 e inferior

Agregar Text.defaultProps.allowFontScaling=false al comienzo de la aplicación (p. ej., main.js o app.js, etc.) para aplicar este accesorio en todos los componentes de texto en toda la aplicación.

  • Cuando lo agrego al constructor en App.js, aparece un error, ¿me pierdo algo?

    – ROI

    23 de febrero de 2018 a las 17:05

  • @AnshulKoka, ¿puedes confirmar esto? Estaba revisando la documentación y no vi nada relacionado con los accesorios predeterminados y allowFontScalling.

    – AJA

    12 de julio de 2018 a las 7:42

  • @AJA Acabo de actualizar de react-native 0.55.4 a 0.56.0 hoy y Text.defaultProps aparece como indefinido.

    – Anshuul Kai

    12 de julio de 2018 a las 8:46


Avatar de usuario de Keshav Gera
keshav gera

When user increase full font size from setting 

La ampliación del tamaño de la fuente del dispositivo no se romperá (estilo inteligente).

index.js file


import {AppRegistry} from 'react-native';
import App from './src/App';
import {name as appName} from './app.json';
import {Text, TextInput} from 'react-native';

AppRegistry.registerComponent(appName, () => App);

//ADD this 
if (Text.defaultProps == null) {
    Text.defaultProps = {};
    Text.defaultProps.allowFontScaling = false;
}

if (TextInput.defaultProps == null) {
    TextInput.defaultProps = {};
    TextInput.defaultProps.allowFontScaling = false;
}

<CalendarStrip
    shouldAllowFontScaling={false}
/>

También tenga en cuenta que algunos componentes no obedecerán la configuración de escalado de fuentes, por ejemplo: Alert, PickerIOS, DatePickerIOS, TabBarIOS, SegmentedControlIOS, ya que todos se dibujan de forma nativa y no dependen del componente Texto.

 if (Text.defaultProps == null) {
            Text.defaultProps = {};
            Text.defaultProps.allowFontScaling = false;
        }

Mantuve este fragmento de código dentro del constructor de index.js. Realmente funcionó bien. Por el estoy usando reaccionar versión nativa 0.59.9 para tu información

Llego un poco tarde, pero si alguien quiere una respuesta con Typescript, aquí está

interface TextWithDefaultProps extends Text {
  defaultProps?: { allowFontScaling?: boolean };
}

(Text as unknown as TextWithDefaultProps).defaultProps = {
   ...((Text as unknown as TextWithDefaultProps).defaultProps || {}),
   allowFontScaling: false,
 };

Avatar de usuario de Sebastien Lorber
sebastien lorber

Crear un <AppText> componente y utilícelo con sus ajustes preestablecidos en lugar del original, con su propio valor predeterminado, incluida la escala de fuente falsa. Esto es mejor porque puedes enriquecerlo con tu propia API.

Por ejemplo, mi AppText permite hacer cosas como:

<AppText id="some.translation.key" color="primary" size="l" underline italic bold/>

Avatar de usuario de Joseph
Joseph

En otro archivo, importe el actual Text componente como ScaledText así como una copia de seguridad, y luego redefinir Textanulando el allowFontScaling apuntalar.

export function Text(props) {
  return <ScaledText {...props} allowFontScaling={false} />;
}

Luego, importe su definido localmente Text componente, en lugar del React Native incorporado Text. Esto también es útil si desea deshabilitar elegantemente el escalado de fuentes solo en ciertas partes de su aplicación.

¿Ha sido útil esta solución?