Yerel Duyarlı Yazı Tipi Boyutuna Tepki Ver


92

Yerel tutamacın nasıl tepki verdiğini veya duyarlı yazı tipini nasıl yaptığını sormak istiyorum. Örneğin iphone 4s'de fontSize: 14'üm var, iphone 6'da ise fontSize: 18 var.


19
Yazı tipi ölçeklemeyi tamamen devre dışı Text.defaultProps.allowFontScaling=false
bırakmanın

1
@CoderDave, bu harika!
Abdo

Tam fontSize yerine ekran boyutuna dayalı göreceli fontSize istemeniz durumunda npmjs.com/package/react-native-responsive-dimensions'ı deneyebilirsiniz , bu aygıtın ekranına göre fontlarınızı otomatik olarak yeniden boyutlandıracaktırSize
Dani Akash

Yanıtlar:


98

PixelRatio'yu kullanabilirsiniz

Örneğin:

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

Düzenle:

Başka bir örnek:

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

Kullanım:

fontSize: normalize(24)

Boyutların her <Text />bileşende önceden tanımlanmış boyutlara göre kullanılmasına izin vererek bir adım daha ileri gidebilirsiniz .

Misal:

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

22
burada const ölçeğinizi nerede kullandınız?
Jan Franz Palngipang

2
Bu hiçbir şey yapmıyor gibi görünüyor. mini her zaman === 12
A.com

14
İOS olmayan cihazlar için neden 2 çıkarıyorsunuz?
Parth Tamane

51

Yazdığımız basit, anlaşılır, ölçekleme araçları işlevlerini kullanıyoruz:

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

Birçok ifs yapmak için size zaman kazandırır. Blog yazımda daha fazlasını okuyabilirsiniz .


Düzenleme: Bu işlevleri kendi npm paketlerine çıkarmanın yararlı olabileceğini düşündüm ScaledSheet, otomatik olarak ölçeklenen bir sürümü olan pakete de ekledim StyleSheet. Burada bulabilirsiniz: tepki-yerel-boyut-meseleleri .


Teşekkürler, bu araçları kullanmak için en iyi senaryo nedir? Scale, verticaleScale ve moderateScale nerede kullanılır?
Pir Shukarullah Shah

4
FontSize, margins, image ve Svg size gibi ölçeklendirme gerektiren hemen hemen her şeyde moderateScale kullanıyorum (mizanpaj için flex kullanıyorum) çünkü imo ölçeklendirme doğrusal olmamalı, ama bu kişisel bir tercih meselesi. Doğrusal bir sonuç elde etmek istiyorsanız, çoğunlukla ölçek kullanın ve kap yükseklikleri gibi şeylerde verticalScale kullanın.
nirsky

16

Duyarlı birimler şu anda react-native olarak mevcut olmadığından, en iyi seçeneğinizin ekran boyutunu tespit etmek ve ardından bunu cihaz türünü anlamak ve fontSize koşuluna göre ayarlamak için kullanmak olduğunu söyleyebilirim.

Şöyle bir modül yazabilirsiniz:

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

Her cihaz için varsayılan genişlik ve yüksekliğin ne olduğuna bakmanız yeterlidir. Cihaz yönünü değiştirdiğinde genişlik ve yükseklik çevrilirse, bunun yerine en boy oranını kullanabilir veya genişliği bulmak için iki boyuttan daha küçük olanı anlayabilirsiniz.

Bu modül veya bu , cihaz boyutlarını veya cihaz türünü bulmanıza yardımcı olabilir.


react-native-device'ı yükledim ancak uygulamayı çalıştırdığımda bana "Dimension modülü çözülemiyor" hatası veriyor
Sydney Loteria

Modül için doğru RN sürümünü kullandığınızdan emin olmanız gerekiyor gibi görünüyor
Isaac Madwed

React Native'in en son sürümünü kullanıyorum :) Sanırım şu anda desteklenmiyor mu?
Sydney Loteria

Muhtemelen ... Belki node_modules klasörünüzü kaldırmayı deneyin ve yenidennpm install
Isaac Madwed

6

Yazdığım kütüphaneye bir göz atın: https://github.com/tachyons-css/react-native-style-tachyons

remBaşlangıçta, sizin PixelRatioveya diğer aygıt özelliklerinden bağımsız hale getirebileceğiniz bir kök fontSize ( ) belirlemenize olanak tanır .

Ardından rem, yalnızca fontSize değil, dolgu vb. Öğelerinize göre stiller alırsınız :

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

Genişletme:

  • f5her zaman temel yazı tipi boyutunuzdur
  • pa2 temel yazı tipi boyutunuza göre dolgu sağlar.

5

Ben sadece benim için iyi çalışan ekran boyutunun oranını kullanıyorum.

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

Ölçek

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}

Bu, iPhone 6 Simülatörünü kullanmanız gerektiği ve orada nasıl göründüğüne bağlı olarak diğer cihazlarda iyi görüneceği anlamına mı geliyor?
Walter Monecke

@WalterMonecke benim durumumda evet. Diğer simülatörü bir üs olarak kullanmak için de uyarlayabilirsiniz.
shentaoy

4

adjustsFontSizeToFitve numberOfLinesbenim için çalışıyor. Uzun e-postayı 1 satıra ayarlarlar.

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

10
belgelere göre 'ayarsFontSizeToFit' yalnızca iOS için geçerlidir
mdehghani

Bu android için çalışmıyor
Samantha Withanage

3

Aşağıdakileri yaparak bunun üstesinden gelmeyi başardım.

  1. Sahip olduğunuz mevcut görünüm için beğendiğiniz yazı tipi boyutunu seçin (Simülatörde kullandığınız mevcut cihaz için iyi göründüğünden emin olun).

  2. import { Dimensions } from 'react-native' ve bileşenin dışındaki genişliği şu şekilde tanımlayın: let width = Dimensions.get('window').width;

  3. Şimdi console.log (genişlik) ve not edin. İyi görünen yazı tipi boyutunuz 15 ve genişliğiniz örneğin 360 ise, 360 alın ve 15'e bölün (= 24). Bu, farklı boyutlara uyum sağlayacak önemli değer olacak.

    Bu numarayı stiller nesnenizde şu şekilde kullanın: textFontSize: { fontSize = width / 24 },...

Artık duyarlı bir fontSize var.


hey gerçekten işe yarıyor mu? f1 = genişlik / (genişlik / boyut) bu çalışamaz mı?
Elrond

1
Kullanmaya son verdim react-native-text.
Walter Monecke

3

Esnek düzen kullanabiliriz ve duyarlı yazı tipi boyutları için AdjustsFontSizeToFit = {true} kullanabiliriz. Metin, kabın boyutuna göre ayarlanır.

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

Ancak stillerde bir yazı tipi boyutu da koymanız gerekir, ancak bu durumda FontSizeToFit çalışmasını ayarlar.

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

2

Kısa süre önce bu sorunla karşılaştım ve react-native-extended-stil sayfasını kullanmaya başladım

remEkran boyutuna göre size değer ve ek boyut koşulları ayarlayabilirsiniz . Dokümanlara göre:

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

Neden kullanmıyorsunuz PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);, pdAndroid'deki birimlerle aynı .


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

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

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

fontScalecihazınıza göre ölçek alın .


fontscale, kullandığım Android Emulator 4_WVGA_Nexus_S_API sanal cihazında sadece 1 döndürüyor.
reggie3

0

Bu şekilde kullanmam gerekiyor, bunu kullandım ve iyi çalışıyor.

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

Aynı 1080x1920 cihazım olduğu gibi

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%")

Tüm cihazlar için çalışıyor


0

Benim için biraz farklı bir yaklaşım işe yaradı: -

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

Piksel Oranına bakınCihaz yoğunluğuna göre işlevi daha iyi ayarlamanıza izin verdiği için .


-3

Bunun gibi bir şey kullanabilirsiniz.

var {yükseklik, genişlik} = Boyutlar.get ('pencere'); var textFontSize = genişlik * 0,03;

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

Umarım bu, herhangi bir üçüncü taraf kitaplığı yüklemeden yardımcı olur.


1
ve 0.03 nereden geldi?
David Noreña

duyarlı olacak mı?
Deepak Ganachari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.