如何在 React Native 中为不同的 IOS 设备设置字体大小

IT技术 javascript reactjs react-native
2021-05-19 02:40:06

在 react-native 我设计了一个示例,当我在不同的 IOS 设备中检查它时,这是我的代码:

render() {
      return (
        <View style={styles.container}>
             <View style={styles.body}>
             <TouchableHighlight style={styles.facebook} >
             <View style={styles.row}>
             <Image style={styles.icon} source={require('image!fb')}/>
             <Text style={styles.facebookText} >Continue with Facebook</Text>
             </View>
          </TouchableHighlight>
        </View>
        </View>
      )
  }
};
var styles = StyleSheet.create({
  container:{
    marginTop: 65,
    flexDirection:'column',
    flex:1,
    backgroundColor:'transparent'
  },
   body:{
    flex:.5
  },
  facebook:{
    marginTop: 25,
    height: 50,
    padding: 10,
    marginRight: 40,
    marginLeft: 40,
    backgroundColor: '#1A8A29',
  },
    row:{
    flexDirection:'row',
  },
  facebookText:{
    marginLeft: 8,
    fontSize: 20,
    color: 'white',
    alignSelf:'center'
  },
  icon:{
    marginTop: 3,
     marginLeft: 5,
      width: 25,
      height: 25
    }
})

我检查 iphone-6 和 5s 字体问题时, 任何人都可以帮助我解决这个问题,如何在 react-native 中为不同的 IOS 设备设置字体大小,任何帮助都非常有用

3个回答

我为我的项目编写了以下代码:

在文件上:multiResolution.js我有:

export function getCorrectFontSizeForScreen(PixelRatio, screenWidth, screenHeight, currentFont){
  let devRatio = PixelRatio.get();
  let factor = (((screenWidth*devRatio)/320)+((screenHeight*devRatio)/640))/2.0;
  let maxFontDifferFactor = 5; //the maximum pixels of font size we can go up or down
  // console.log("The factor is: "+factor);
  if(factor<=1){
    return currentFont-float2int(maxFontDifferFactor*0.3);
  }else if((factor>=1) && (factor<=1.6)){
    return currentFont-float2int(maxFontDifferFactor*0.1);
  }else if((factor>=1.6) && (factor<=2)){
    return currentFont;
  }else if((factor>=2) && (factor<=3)){
    return currentFont+float2int(maxFontDifferFactor*0.65);
  }else if (factor>=3){
    return currentFont+float2int(maxFontDifferFactor);
  }

}

function float2int (value) {
  return value | 0;
}

然后在每个 react-native 组件上我做:

import { PixelRatio } from 'react-native';
import {getCorrectFontSizeForScreen} from './multiResolution' 
import Dimensions from 'Dimensions';
const {height:h, width:w} = Dimensions.get('window'); // Screen dimensions in current orientation

然后在我的styles我做:

var portraitStyles = StyleSheet.create({
  titleText: {
    fontSize: getCorrectFontSizeForScreen(PixelRatio, w,h,27),//magic takes place here
  },
});

这是自定义的,但对我来说效果很好。

另外(与您的问题无关,但我还是要说),我使用与 screenWidth 和 screenHeight 相关的宽度和高度,如下所示:

aStyleForAnElement:{    //this element will occupy
    width: w*0.55, //55% of the screen width
    height:h*0.05  //5% of the screen height
}

到目前为止,这就是我在项目中支持不同屏幕尺寸的方式。

新答案:

随着时间的推移,我们学习。在我写这篇文章的时候,我没有其他解决方案来管理字体大小而不是使用自定义代码,但现在我不必这样做:

我只是告诉我们的设计师设计可用的最低分辨率 320x480(并以磅为单位而不是像素为我提供字体大小),然后我在设计 320x480 时只使用磅而不是像素。

320x480 以上的所有屏幕都将使用 react-native 自动处理,我根本不需要编写任何花哨的代码来自动管理它。

我的组件现在看起来像这样:

BUTTON_TEXT: {
  textAlign: 'center',
  fontSize: 16, // this is 16 points
  color: 'white',
  backgroundColor: 'transparent',
},

只有一个概念,但我会尝试以下操作:

const Dimensions = require('Dimensions');
const Viewport = Dimensions.get('window');

const IPHONE6_WIDTH = 750; // check this, since I'm not sure about iPhone 6 width

class YourComponent extends React.Component {
  constructor(props) {
    super(props);
  }

  getFontSize() {
    return ({
      fontSize: ((Viewport.width * Viewport.scale) === IPHONE6_WIDTH) ? 14 : 16
    });
  }

  render() {
    <View>
      <Text style={[styles.facebookText, this.getFontSize()]}>Continue with Facebook</Text>
    </View>
  }
}

为应用程序创建通用样式。在所有样式组件中重用此默认样式属性。

src/common/style.js

import { Dimensions } from 'react-native';
const { width, height } = Dimensions.get('window');

export const ColorPrimary  = '#5CFE48';
export const SmallPhone = () => {
  if(width<=320) // Here you could use "react-native-device-info" to get device information.
     return true
  else 
     return false
}

在组件样式中导入通用样式文件。

import { SmallPhone, ColorPrimary } from '../../common/style';
... 
...
const styles =  StyleSheet.create({
  headerLabel: {
    fontSize: SmallPhone() ? 14:26,
    color: ColorPrimary
  }
});

你也可以直接在 common style.js 中为每个设备指定特定的字体大小,只需简单地调用SmallPhone函数而不是使用三元运算符。