有没有办法在react native中全局设置字体?

时间:2018-06-25 12:33:07

标签: react-native hybrid-mobile-app

是否可以在react native中全局设置字体? 我需要做的是在整个应用程序中应用每个Text组件的自定义字体。 非常感谢您的帮助,谢谢

6 个答案:

答案 0 :(得分:2)

一种创建RN Text的包装的方式,例如说MyTextCustomFont。

const MyTextCustomFont = (props) => {
   return (
        <Text styles={{fontFamily:'myFont'}} {...props} >{props.children}</Text>
   )
}

导入此MyTextCustomFont并在任何地方使用。

其他是定义样式对象并导入,可以在任何需要的地方使用

答案 1 :(得分:2)

为此,我们必须实现一个方法,在该方法中,我们将覆盖react native中的Text组件创建。在这种情况下,我们将设置默认的字体系列或大小或我们要默认设置的任何属性。

// typography.js

import React from 'react'
import { Text, Platform, StyleSheet } from 'react-native'

export const typography = () => {
  const oldTextRender = Text.render
  Text.render = function(...args) {
    const origin = oldTextRender.call(this, ...args)
    return React.cloneElement(origin, {
      style: [styles.defaultText, origin.props.style],
    })
  }
}

const styles = StyleSheet.create({
  defaultText: {
    fontFamily: 'NunitoSans-Regular',//Default font family
  }
}); 

然后在index.js中,您必须执行以下操作:-

从'./src/utils/typography'导入{排版}

typography()

详细答案在这里: https://ospfolio.com/two-way-to-change-default-font-family-in-react-native/

答案 2 :(得分:0)

app.js

import styles from './styles';
{...}
 <Text style={styles.text}>hello World </Text>
{...}

styles.js

import {StyleSheet} from 'react-native';

const styles = StyleSheet.create({
 text: {
    // define your font or size or whatever you want to style here
  },

在每个文本上使用样式,所有更改都会影响所有文本组件

答案 3 :(得分:0)

我认为您的问题是在react native中添加自定义字体。

1。将自定义字体添加到资产中

将所需的所有字体文件添加到react native项目根目录中的“ assets / fonts”文件夹中:

enter image description here

2。编辑Package.json

将rnpm添加到package.json中,以提供字体文件的路径:

"rnpm": {
    "assets": [
    "./assets/fonts/"
    ]
},

3。链接资产文件

在您的本机项目根文件夹中运行此命令

react-native link

这应该在iOS的Info.plist文件中添加字体引用,然后在Android上将字体文件复制到android / app / src / main / assets / fonts。

4。在样式表中添加

添加带有您的字体名称的fontFamily属性:

const styles = StyleSheet.create({
      title: {
        fontSize: 16,
        fontFamily: 'PlayfairDisplay-Bold',
        color: '#fff',
        paddingRight: 20,
      },
    });

答案 4 :(得分:0)

所以,我前段时间已经很轻松地制作了一个组件。这是与Expo一起使用的,我不知道是原生的原生反应。

在应用程序的开头:

import { Font, Asset } from 'expo'

async initFont() {
    try {
      await Font.loadAsync({
        'Bariol': require('src/assets/font/Bariol_Regular.otf'),
        'Bariol Bold': require('src/assets/font/Bariol_Bold.otf'),
      })
      this.setState({ fontReady: true })
    } catch (e) {
      console.log(e)
    }
  }

然后,您必须创建一个包含以下代码的组件文件,例如text.js

export default function (props) {
  let font = { fontFamily: 'Bariol' }
  if (props.bold) {
    font = { fontFamily: 'Bariol Bold' }
  }

  const { bold, style, children, ...newProps } = props
  return (
    <Text {...newProps} style={[Style.text, props.style, font]}>
      {props.children}
    </Text>
  )
}

最后,在任何其他组件/页面中,只需导入MyText:

import Text from 'path/to/text.js'

像普通的Text组件一样使用它:

<Text bold>Hello World!</Text>

即使此解决方案看上去比其他解决方案都复杂一点,但只要安装成功,它就更容易使用,因为您只需导入文本即可。

答案 5 :(得分:0)

您可以通过在任何使用 Text 的组件中添加此内容来覆盖 Text 行为:

编辑:将此代码添加到您的 App.js 或主文件中

let oldRender = Text.render;
Text.render = function (...args) {
    let origin = oldRender.call(this, ...args);
    return React.cloneElement(origin, {
        style: [{color: 'red', fontFamily: 'Arial'}, origin.props.style]
    });
} 

对于 React Native 0.56 或以下版本,将此代码添加到您的 App.js 或主文件中

let oldRender = Text.prototype.render;
Text.prototype.render = function (...args) {
    let origin = oldRender.call(this, ...args);
    return React.cloneElement(origin, {
        style: [{color: 'red', fontFamily: 'Arial'}, origin.props.style]
    });
};

Referencecreate your own component, such as MyAppText. MyAppText 将是一个简单的组件,它使用您的通用样式呈现一个 Text 组件,并且可以通过其他道具等。