React Native 响应式字体大小

IT技术 ios reactjs react-native
2021-04-20 02:00:20

我想问一下如何react-native句柄或做响应式字体。例如,在 iphone 4s 中,我的字体大小为:14,而在 iphone 6 中,我的字体大小为:18。

6个回答

您可以使用PixelRatio

例如:

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

编辑:

另一个例子:

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

用法:

fontSize: normalize(24)

您可以通过允许<Text />按预定义大小在每个组件上使用大小来更进一步

例子:

const styles = {
  mini: {
    fontSize: normalize(12),
  },
  small: {
    fontSize: normalize(15),
  },
  medium: {
    fontSize: normalize(17),
  },
  large: {
    fontSize: normalize(20),
  },
  xlarge: {
    fontSize: normalize(24),
  },
};
这似乎没有任何作用。迷你总是 === 12
2021-05-27 02:00:20
@chinloong 谢谢,这很好用,但为什么在 Android 上是 -2?
2021-05-29 02:00:20
为什么要为非 ios 设备减去 2?
2021-06-02 02:00:20
例如,它不适用于 iPhone 12 mini 和 iPhone X,因为它们的宽度均为 375,像素比为 3。虽然显然,布局和字体大小应该注意差异。
2021-06-07 02:00:20
你在这里在哪里使用了你的 const 比例?
2021-06-11 02:00:20

我们使用我们编写的简单、直接、可扩展的 utils 函数:

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

为您节省一些时间做许多 ifs。您可以在我的博客文章中阅读更多相关信息


编辑:我认为将这些函数提取到它们自己的 npm 包中可能会有所帮助,我也包含ScaledSheet在包中,它是StyleSheet. 你可以在这里找到它:react-native-size-matters

谢谢,使用此实用程序的最佳场景是什么?我的意思是在哪里使用 scale、verticaleScale 和 mediumScale?
2021-05-31 02:00:20
我在几乎所有需要缩放的东西上都使用了 mediumScale,比如字体大小、边距、图像和 Svg 大小(对于布局我使用 flex),因为 imo 缩放不应该是线性的,但这是个人喜好的问题。如果您想获得线性结果,则主要使用缩放,并在容器高度等内容上使用verticalScale。
2021-06-21 02:00:20

adjustsFontSizeToFitnumberOfLines为我工作。他们将长电子邮件调整为 1 行。

<View>
  <Text
    numberOfLines={1}
    adjustsFontSizeToFit
    style={{textAlign:'center',fontSize:30}}
  >
    {this.props.email}
  </Text>
</View>
它也适用于 android @mdehghani
2021-05-30 02:00:20
根据文档“adjustsFontSizeToFit”仅适用于 iOS
2021-06-01 02:00:20
也适用于我,这篇文章应该被接受为正确答案!
2021-06-12 02:00:20
我可以确认它适用于 Android 和 iOS!这正是我正在寻找的。应该是正确答案。
2021-06-13 02:00:20

因为响应式单元目前在 react-native 中不可用,我想说你最好的办法是检测屏幕大小,然后使用它来推断设备类型并有条件地设置 fontSize。

你可以编写一个module,如:

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

您只需要查看每个设备的默认宽度和高度。如果在设备改变方向时翻转了宽度和高度,您可能可以使用纵横比,或者只是找出两个维度中较小的一个来计算宽度。

module这一个可以帮你找到设备的尺寸或设备类型。

我已经安装了 react-native-device 但是当我运行应用程序时它给了我一个“无法解析module维度”的错误
2021-05-27 02:00:20
听起来您需要确保为module使用正确版本的 RN
2021-05-30 02:00:20
可能......也许尝试删除您的 node_modules 文件夹并重新 npm install
2021-06-07 02:00:20
我正在使用最新版本的 React Native :) 我认为它目前不受支持?
2021-06-14 02:00:20

我通过执行以下操作设法克服了这个问题。

  1. 为您拥有的当前视图选择您喜欢的字体大小(确保它适合您在模拟器中使用的当前设备)。

  2. import { Dimensions } from 'react-native' 并定义组件外部的宽度,如下所示: let width = Dimensions.get('window').width;

  3. 现在 console.log(width) 并写下来。例如,如果您好看的字体大小是 15,而您的宽度是 360,那么取 360 并除以 15(= 24)。这将是将调整为不同大小的重要值。

    在你的样式对象中使用这个数字,如下所示: textFontSize: { fontSize = width / 24 },...

现在你有了一个响应式 fontSize。

嘿它真的有效吗?f1 = width/ (width/size) 这不能工作?
2021-06-08 02:00:20
我最终使用了react-native-text.
2021-06-08 02:00:20