ReactNativeレスポンシブフォントサイズ


95

ネイティブハンドルにどのように反応するか、またはレスポンシブフォントをどのように実行するかを尋ねたいと思います。たとえば、iphone 4sではfontSize:14ですが、iphone6ではfontSize:18です。


19
フォントスケーリングを完全に無効にする方法を探している人は、次を使用してくださいText.defaultProps.allowFontScaling=false
CoderDave 2016

1
@CoderDaveこれは素晴らしいです!
アブド2017年

1
正確なfontSizeではなく画面サイズに基づく相対的なfontSizeが必要な場合は、npmjs.com / package / react
Dani Akash

回答:


100

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

22
ここでconstスケールをどこで利用しましたか?
Jan Franz Palngipang 2017

2
これは何もしないようです。ミニ常に=== 12
A.com

16
iOS以外のデバイスで2を引くのはなぜですか?
ParthTamane19年

@chinloongおかげでこれはうまく機能しますが、Androidで-2
colakollektiv

52

私たちは、私たちが書いたシンプルでわかりやすいスケーリング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};

多くのifを実行する時間を節約できます。あなたは私のブログ投稿でそれについてもっと読むことができます。


編集:これらの関数を独自のnpmパッケージに抽出すると役立つかもしれないと思いました。またScaledSheet、の自動スケーリングバージョンであるパッケージにも含まれていますStyleSheet。あなたはここでそれを見つけることができます:react-native-size-matters


おかげで、このユーティリティを使用するための最良のシナリオは何ですか?scale、verticaleScale、moderateScaleをどこで使用するのですか?
Pir Shukarullah Shah 2017

4
fontSize、margins、image、Svgサイズ(レイアウトの場合はflexを使用)など、スケーリングが必要なほとんどすべてにmoderateScaleを使用します。これは、imoスケーリングが線形であってはならないためですが、これは個人的な好みです。線形の結果を達成したい場合は、主にスケールを使用し、コンテナの高さなどにverticalScaleを使用します。
nirsky 2017

16

現時点ではレスポンシブユニットはreact-nativeで利用できないため、画面サイズを検出し、それを使用してデバイスタイプを推測し、fontSizeを条件付きで設定するのが最善の策だと思います。

次のようなモジュールを作成できます。

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

各デバイスのデフォルトの幅と高さを調べる必要があります。デバイスの向きが変わったときに幅と高さが反転している場合は、代わりにアスペクト比を使用するか、2つの次元のうち小さい方を計算して幅を計算できる場合があります。

このモジュールまたはこのいずれかを使用すると、デバイスの寸法やデバイスの種類を見つけることができます。


react-native-deviceをインストールしましたが、アプリを実行すると「モジュールのディメンションを解決できません」というエラーが表示されます
Sydney Loteria 2015年

モジュールに正しいバージョンのRNを使用していることを確認する必要があるようです
Isaac Madwed 2015年

私はReactNativeの最新バージョンを使用しています:)現在サポートされていないと思いますか?
シドニーロテリア2015年

おそらく... node_modulesフォルダーを削除して再試行してくださいnpm install
Isaac Madwed 2015年

6

私が書いたライブラリを見てくださいhttps//github.com/tachyons-css/react-native-style-tachyons

rem起動時にroot-fontSize()を指定できます。これは、自分PixelRatioまたは他のデバイスの特性に依存させることができます。

次にrem、fontSizeだけでなく、パディングなどに関連するスタイルを取得します。

<Text style={[s.f5, s.pa2, s.tc]}>
     Something
</Text>

拡張:

  • f5常にベースフォントサイズです
  • pa2 base-fontsizeに関連するパディングを提供します。

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

テスト

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}

これは、iPhone 6シミュレーターを使用する必要があり、その外観に基づいて、他のデバイスでも見栄えがすることを意味しますか?
WalterMonecke19年

私の場合は@WalterMoneckeはい。他のシミュレーターをベースとして使用するように適応させることもできます。
shentaoy

4

私は次のことを行うことでこれを克服することができました。

  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 =幅/(幅/サイズ)これは機能しませんか?
エルロンド

1
を使用することになりましたreact-native-text
WalterMonecke19年

4

adjustsFontSizeToFitそしてnumberOfLines私のために働きます。彼らは長いメールを1行に調整します。

<View>
  <Text
    numberOfLines={1}
    adjustsFontSizeToFit
    style={{textAlign:'center',fontSize:30}}
  >
    {this.props.email}
  </Text>
</View>

10
マニュアルに従って「adjustsFontSizeToFitは」のみのiOSに適用されます
mdehghani

3

フレックスレイアウトを使用し、レスポンシブフォントサイズにadjustsFontSizeToFit = {true}を使用できます。テキストは、コンテナのサイズに応じて調整されます。

     <Text
    adjustsFontSizeToFit
    style={styles.valueField}>{value}
    </Text>

ただし、スタイルでは、フォントサイズも入力する必要があります。そうすると、adjustsFontSizeToFitが機能します。

    valueField: {
    flex: 3,
    fontSize: 48,
    marginBottom: 5,
    color: '#00A398',
},

2

私は最近この問題に遭遇し、react-native-extended-stylesheetを使用することになりました

rem画面サイズに基づいて、値と追加のサイズ条件を設定できます。ドキュメントによると:

// component
const styles = EStyleSheet.create({
  text: {
    fontSize: '1.5rem',
    marginHorizontal: '2rem'
  }
});
// app entry
let {height, width} = Dimensions.get('window');
EStyleSheet.build({
  $rem: width > 340 ? 18 : 16
});


2
import { Dimensions } from 'react-native';

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

const styles = StyleSheet.create({
    fontSize: idleFontSize / fontScale,
});

fontScaleデバイスごとにスケールを取得します


fontscaleは、使用しているAndroid Emulator4_WVGA_Nexus_S_API仮想デバイスで1を返します。
reggie3

0

この方法で使用する必要があります。これを使用しましたが、正常に機能しています。

react-native-responsive-screen npm install react-native-responsive-screen --save

私が1080x1920のデバイスを持っているように

The vertical number we calculate from height **hp**
height:200
200/1920*100 = 10.41% - height:hp("10.41%")


The Horizontal number we calculate from width **wp**
width:200
200/1080*100 = 18.51% - Width:wp("18.51%")

すべてのデバイスで機能しています


0

少し異なるアプローチが私のために働いた:-

const normalize = (size: number): number => {
  const scale = screenWidth / 320;
  const newSize = size * scale;
  let calculatedSize = Math.round(PixelRatio.roundToNearestPixel(newSize))

  if (PixelRatio.get() < 3)
    return calculatedSize - 0.5
  return calculatedSize
};

デバイスの密度に基づいて機能をより適切に設定できるため、ピクセル比を参照してください。


-3

あなたはこのようなものを使うことができます。

var {高さ、幅} = Dimensions.get( 'window'); var textFontSize = width * 0.03;

inputText: {
    color : TEXT_COLOR_PRIMARY,
    width: '80%',
    fontSize: textFontSize
}

これがサードパーティのライブラリをインストールせずに役立つことを願っています。


1
そして0.03はどこから来たのですか?
デビッドノレーニャ

レスポンシブになりますか?
DeepakGanachari20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.