Je voudrais demander comment réagissent natif gérer ou faire la police sensible. Par exemple, dans l'iphone 4s, j'ai FontSize: 14, alors que dans l'iphone 6, j'ai FontSize: 18.
Vous pouvez utiliser PixelRatio
par exemple:
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
}
});
Modifier:
Un autre exemple:
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
}
}
Usage:
fontSize: normalize(24)
vous pouvez aller plus loin en permettant aux tailles d'être utilisées sur chaque composant <Text />
par une taille prédéfinie.
Exemple:
const styles = {
mini: {
fontSize: normalize(12),
},
small: {
fontSize: normalize(15),
},
medium: {
fontSize: normalize(17),
},
large: {
fontSize: normalize(20),
},
xlarge: {
fontSize: normalize(24),
},
};
Nous utilisons une simple, simple, mise à l'échelle des fonctions utils nous avons écrit:
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};
Vous fait gagner du temps en faisant beaucoup de si. Vous pouvez en savoir plus à ce sujet sur mon blog .
ScaledSheet
dans le paquet, qui est une version automatiquement mise à l'échelle de StyleSheet
. Vous pouvez le trouver ici: réagit-natif-taille-questions . Jetez un oeil à la bibliothèque que j'ai écrite: https://github.com/tachyons-css/react-native-style-tachyons
Il vous permet de spécifier une taille de fonte racine (rem
) au démarrage, que vous pouvez subordonner à votre PixelRatio
ou à d’autres caractéristiques du périphérique.
Ensuite, vous obtenez des styles relatifs à votre rem
, pas seulement fontSize, mais aussi les rembourrages, etc.:
<Text style={[s.f5, s.pa2, s.tc]}>
Something
</Text>
Expanation:
f5
est toujours votre taille de basepa2
vous donne un rembourrage relatif à votre taille de base.Étant donné que les unités réactives ne sont pas disponibles en mode réactif natif pour le moment, je dirais que votre meilleur choix serait de détecter la taille de l'écran, puis de l'utiliser pour déduire le type de périphérique et définir la taille de police font conditionnellement.
Vous pourriez écrire un module comme:
function fontSizer (screenWidth) {
if(screenWidth > 400){
return 18;
}else if(screenWidth > 250){
return 14;
}else {
return 12;
}
}
Vous aurez juste besoin de rechercher quelles sont la largeur et la hauteur par défaut pour chaque périphérique. Si la largeur et la hauteur sont inversées lorsque l’appareil change d’orientation, vous pourrez peut-être utiliser le format de l’image ou simplement calculer la plus petite des deux dimensions pour déterminer la largeur.
Ce module ou celui-ci peut vous aider à trouver les dimensions ou le type d'appareil.
J'utilise simplement le ratio de la taille de l'écran, ce qui me convient parfaitement.
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));
Tester
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}
importer {Dimensions} de 'react-native';
const {width, fontScale } = Dimensions.get ("fenêtre");
const styles = StyleSheet.create ({ fontSize: idleFontSize/ fontScale , });
fontScale obtenir une échelle en fonction de votre appareil .
J'ai réussi à surmonter cela en procédant comme suit.
Choisissez la taille de police de votre choix pour la vue actuelle (assurez-vous que it convient bien au périphérique que vous utilisez dans le simulateur ).
import { Dimensions } from 'react-native'
et définissez la largeur en dehors du composant comme suit: let width = Dimensions.get('window').width;
Maintenant, console.log (largeur) et notez-le. Si votre belle police Taille est de 15 et votre largeur de 360 par exemple, prenez 360 et Divisez par 15 (= 24). Cela va être la valeur importante qui va être ajustée à différentes tailles.
Utilisez ce numéro dans votre objet styles comme suit: textFontSize: { fontSize = width / 24 },...
Vous avez maintenant une fontSize sensible.
Pourquoi ne pas utiliser PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);
, c’est la même chose que les unités pd
sous Android.
adjustsFontSizeToFit
et numberOfLines
fonctionne pour moi. Ils ajustent les longs emails en 1 ligne.
<View>
<Text
numberOfLines={1}
adjustsFontSizeToFit
style={{textAlign:'center',fontSize:30}}
>
{this.props.email}
</Text>
</View>
J'ai récemment rencontré ce problème et fini par utiliser react-native-extended-stylesheet
Vous pouvez définir votre valeur rem
et des conditions de taille supplémentaires en fonction de la taille de l'écran. Selon les docs:
// 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
});
Nous pouvons utiliser flex layout et utiliser ajustsFontSizeToFit = {true} pour les tailles de police réactives.
<Text
adjustsFontSizeToFit
style={styles.valueField}>{value}
</Text>
Mais dans les styles, vous devez également définir une taille de police. Dans ce cas, le travail est ajusté par FontsizeToFit.
valueField: {
flex: 3,
fontSize: 48,
marginBottom: 5,
color: '#00A398',
},