【问题标题】:How to disable font scaling in React Native for IOS app?如何在 React Native for IOS 应用程序中禁用字体缩放?
【发布时间】:2017-06-08 01:13:27
【问题描述】:

设备字体大小的放大有时会中断(样式方面)。

【问题讨论】:

  • 这是一个糟糕的选择,因为它会伤害视力不佳的用户,以及手颤抖或其他难以与小触摸目标交互的运动问题的用户。更好的解决方案是修复您的样式,以便字体更改不会破坏它。 (例如,不要使用固定的高度或宽度。)
  • @AaronBrager 并非总是如此,在小型设备上几乎不可能“修复”您的样式以适应同一行上的文本。因此,除非您在屏幕上没有太多要查看的文本,否则您可以更加体贴。所以这完全是可选的,而不是强制性的。什么都适合你的需要,你就这样做。
  • 不必在同一行。一直调大字体大小的用户很乐意看到尴尬的文字换行。
  • 如果项目所有者不希望他们的应用程序崩溃,他们可以使用它。否则他们可以完全忽略这一点并保持字体自动大小。同样,这完全是可选的。 @AaronBrager

标签: ios react-native


【解决方案1】:

禁用字体缩放可能会损害应用的可访问性,理想情况下,如果您想限制使用 React 本机 0.58.0 及更高版本的应用的缩放;在特定的Text 组件上使用maxFontSizeMultiplier prop

但是,如果您绝对想在整个应用程序中禁用字体缩放,您可以通过在 defaultPropsText 中全局设置 allowFontScaling prop 来实现。

您应该将这些行放在您的根入口点(通常为 index.js)中,放在 AppRegistry.registerComponent 之前。

对于 React Native 0.56.0+

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

对于 React Native 的早期版本,您应该只需要第二行,但两者都不会受到伤害。第一行只是防止Text 组件没有defaultProps,React Native 0.56.0 及更高版本就是这种情况。

在您的 React Native 应用程序的入口点文件(通常是 index.jsapp.jsmain.js)中添加以上行,以将此属性应用于应用程序中的所有 Text 组件。

此属性只会影响Text 组件,您可能希望对TextInput 应用相同的更改,这可以通过类似的sn-p 完成:

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

另请注意,某些组件不会遵守字体缩放设置,例如:AlertPickerIOSDatePickerIOSTabBarIOSSegmentedControlIOS,因为这些都是原生绘制的,不依赖于 @ 987654345@组件。

【讨论】:

  • Hackish,但仍然很棒。正在使用它。
  • @KiritModi 我认为 Alert 完全是原生呈现的——所以我猜你无法控制文本在模式中的呈现方式。相反,您需要实现自己的警报组件。
  • 如果有些人想知道在哪里实现它,请将上面的代码放在 ~/index.js 中的导入语句正下方。确保还将Text 组件导入RN。顺便说一句,我正在运行 RN 0.57.8。
  • Text.defaultProps 有时可能是未定义的,所以最好使用:Text.defaultProps = Text.defaultProps || {}。它处理这两种情况。
  • @dphaener 原始检查 Text.defaultProps 未定义。
【解决方案2】:
When user increase full font size from setting 

设备字体大小的放大不会中断(样式方面)。

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

另请注意,某些组件不会遵守字体缩放设置,例如:Alert、PickerIOS、DatePickerIOS、TabBarIOS、SegmentedControlIOS,因为这些都是原生绘制的,不依赖于 Text 组件。

【讨论】:

    【解决方案3】:

    对于 webview,如果字体大小从移动设置更改,我们可以使用 textZoom={100} 属性来处理字体大小更改。

    如果从react-native-webview导入

    <WebView
        textZoom={100}
        source={}/>
    

    【讨论】:

      【解决方案4】:

      在另一个文件中,将实际的Text 组件导入为ScaledText 作为备份,然后重新定义Text,覆盖allowFontScaling 属性。

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

      然后,导入本地定义的 Text 组件,而不是内置的 React Native Text。如果您只想在应用的某些部分优雅地禁用字体缩放,这也很有用。

      【讨论】:

        【解决方案5】:
         if (Text.defaultProps == null) {
                    Text.defaultProps = {};
                    Text.defaultProps.allowFontScaling = false;
                }
        

        我将这段代码保存在index.js的构造函数中。它确实运行良好。我正在使用 react native 版本0.59.9FYI。

        【讨论】:

        • Text.defaultProps = Text.defaultProps || {} ; Text.defaultProps.allowFontScaling = false; 这相当于你的代码
        【解决方案6】:

        对于 React 原生 0.58+

        最好保持字体缩放,但您可以通过使用 Text new prop maxFontSizeMultiplier 来限制它

        对于 React 本机 0.56+ 使用 Levi's answer

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

        对于 React 本机 0.55 及更低版本

        在应用程序的开头添加Text.defaultProps.allowFontScaling=false(例如 main.js 或 app.js 等...)以将此属性应用于整个应用程序的所有文本组件。

        【讨论】:

        • 当我将它添加到 App.js 中的构造函数时,我得到了错误,我错过了什么吗?
        • 非常适合我
        • @AnshulKoka 你能确认一下吗?我正在检查文档,没有看到任何有关默认道具和 allowFontScalling 的信息。
        • @A-J-A 我今天刚从 react-native 0.55.4 升级到 0.56.0,Text.defaultProps 出现未定义。
        【解决方案7】:

        创建一个&lt;AppText&gt; 组件并将其与您的预设一起使用,而不是原始的,使用您自己的默认设置,包括字体缩放为 false。这更好,因为您可以使用自己的 API 来丰富它。

        例如,我的 AppText 允许执行以下操作:

        &lt;AppText id="some.translation.key" color="primary" size="l" underline italic bold/&gt;

        【讨论】:

        • 在某些情况下可能是您需要的,但如果您需要你希望 ReactNavigation 限制 MaterialCommunityIcons 中使用的字体缩放 headerRight?不幸的是,使用&lt;MaterialCommunityIcons name="magnify" allowFontScaling={false}" /&gt; 不起作用。
        猜你喜欢
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-25
        • 2020-11-11
        • 2017-06-10
        相关资源
        最近更新 更多