React Native Responsive字体大小

Syd*_*ria 55 ios reactjs react-native

我想问一下如何反应原生句或做响应式字体.例如在iphone 4s中我有fontSize:14,而在iphone 6中我有fontSize:18.

小智 54

你可以使用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
  }
});
Run Code Online (Sandbox Code Playgroud)

编辑:

另一个例子:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

fontSize: normalize(24)
Run Code Online (Sandbox Code Playgroud)

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

例:

const styles = {
  mini: {
    fontSize: normalize(12),
  },
  small: {
    fontSize: normalize(15),
  },
  medium: {
    fontSize: normalize(17),
  },
  large: {
    fontSize: normalize(20),
  },
  xlarge: {
    fontSize: normalize(24),
  },
};
Run Code Online (Sandbox Code Playgroud)

  • 你在哪里使用你的const量表? (20认同)
  • 对于非iOS设备,为什么要减去2? (3认同)
  • 这似乎没有做任何事情.迷你总是=== 12 (2认同)
  • @chinloong 谢谢,这很好用,但是 **为什么在 Android 上为 -2?** (2认同)
  • 例如,它不适用于 iPhone 12 mini 和 iPhone X,因为它们的宽度均为 375,像素比为 3。不过,显然,布局和字体大小应该意识到差异。 (2认同)

nir*_*sky 34

我们使用一个简单,直接,缩放的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};
Run Code Online (Sandbox Code Playgroud)

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


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

  • 我对几乎所有需要缩放的东西都使用了moderateScale,比如fontSize,margin,image和Svg size(对于我使用flex的布局),因为imo缩放不应该是线性的,但这是个人喜好.如果你想获得线性结果,那么主要使用scale,并在容器高度之类的东西上使用verticalScale. (4认同)

Gun*_*ter 17

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

<View>
  <Text
    numberOfLines={1}
    adjustsFontSizeToFit
    style={{textAlign:'center',fontSize:30}}
  >
    {this.props.email}
  </Text>
</View>
Run Code Online (Sandbox Code Playgroud)

  • 根据文档“adjustsFontSizeToFit”仅适用于 iOS (10认同)

小智 10

因为响应式单元目前在反应式本机中不可用,所以我想说最好的选择是检测屏幕尺寸,然后使用它来推断设备类型并有条件地设置fontSize。

您可以编写类似以下的模块:

function fontSizer (screenWidth) {
  if(screenWidth > 400){
    return 18;
  }else if(screenWidth > 250){
    return 14;
  }else { 
    return 12;
  }
}
Run Code Online (Sandbox Code Playgroud)

您只需要查找每个设备的默认宽度和高度即可。如果在设备更改方向时宽度和高度发生了翻转,您可能可以改用宽高比,或者只是找出两个维度中较小的一个以得出宽度。

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


Wal*_*cke 7

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

  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。


Fab*_*ndl 6

看看我写的库:https://github.com/tachyons-css/react-native-style-tachyons

它允许您rem在启动时指定root-fontSize(),您可以根据您的PixelRatio或其他设备特性来指定它.

然后你得到相对于你的样式rem,不仅是fontSize,还有paddings等:

<Text style={[s.f5, s.pa2, s.tc]}>
     Something
</Text>
Run Code Online (Sandbox Code Playgroud)

Expanation:

  • f5永远是你的base-fontsize
  • pa2 为您提供相对于base-fontsize的填充.


she*_*aoy 5

我只是使用屏幕尺寸的比例,这对我来说很好用。

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));
Run Code Online (Sandbox Code Playgroud)

测试

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}
Run Code Online (Sandbox Code Playgroud)


Par*_*rat 5

import { Dimensions } from 'react-native';

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

const styles = StyleSheet.create({
    fontSize: idleFontSize / fontScale,
});
Run Code Online (Sandbox Code Playgroud)

fontScale根据您的设备获取比例