Chciałbym zapytać, jak reaguje natywna obsługa lub responsywna czcionka. Na przykład w iPhonie 4s mam fontSize: 14, podczas gdy w iPhonie 6 mam fontSize: 18.
Chciałbym zapytać, jak reaguje natywna obsługa lub responsywna czcionka. Na przykład w iPhonie 4s mam fontSize: 14, podczas gdy w iPhonie 6 mam fontSize: 18.
Odpowiedzi:
Możesz użyć PixelRatio
na przykład:
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
}
});
Edytować:
Inny przykład:
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
}
}
Stosowanie:
fontSize: normalize(24)
możesz pójść o krok dalej, zezwalając na użycie rozmiarów na każdym <Text />
komponencie według wstępnie zdefiniowanego rozmiaru.
Przykład:
const styles = {
mini: {
fontSize: normalize(12),
},
small: {
fontSize: normalize(15),
},
medium: {
fontSize: normalize(17),
},
large: {
fontSize: normalize(20),
},
xlarge: {
fontSize: normalize(24),
},
};
Używamy prostych, nieskomplikowanych funkcji narzędzi skalujących, które napisaliśmy:
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};
Oszczędza trochę czasu, wykonując wiele „ifów”. Możesz przeczytać więcej na ten temat na moim blogu .
ScaledSheet
do pakietu, który jest automatycznie skalowaną wersją programu StyleSheet
. Możesz go znaleźć tutaj: reaguj-natywny-rozmiar-sprawy .
Ponieważ jednostki responsywne nie są obecnie dostępne w natywnym reagowaniu, powiedziałbym, że najlepszym rozwiązaniem byłoby wykrycie rozmiaru ekranu, a następnie użycie go do wywnioskowania typu urządzenia i warunkowego ustawienia rozmiaru czcionki.
Możesz napisać moduł taki jak:
function fontSizer (screenWidth) {
if(screenWidth > 400){
return 18;
}else if(screenWidth > 250){
return 14;
}else {
return 12;
}
}
Musisz tylko sprawdzić, jaka jest domyślna szerokość i wysokość dla każdego urządzenia. Jeśli szerokość i wysokość są odwracane, gdy urządzenie zmienia orientację, możesz zamiast tego użyć współczynnika proporcji lub po prostu obliczyć mniejszy z dwóch wymiarów, aby obliczyć szerokość.
Ten lub ten moduł może pomóc Ci znaleźć wymiary lub typ urządzenia.
npm install
Zajrzyj do biblioteki, którą napisałem: https://github.com/tachyons-css/react-native-style-tachyons
Pozwala na określenie root-fontSize ( rem
) przy starcie, który można uzależnić od swojej PixelRatio
lub innych cech urządzenia.
Następnie otrzymujesz style w stosunku do twojego rem
, nie tylko fontSize, ale także dopełnienia itp .:
<Text style={[s.f5, s.pa2, s.tc]}>
Something
</Text>
Ekspansja:
f5
jest zawsze twoim podstawowym rozmiarem czcionkipa2
daje dopełnienie względem twojego podstawowego rozmiaru czcionki.Po prostu używam współczynnika rozmiaru ekranu, który dla mnie działa dobrze.
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));
Test
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}
adjustsFontSizeToFit
i numberOfLines
pracuje dla mnie. Dopasowują długi e-mail do jednej linii.
<View>
<Text
numberOfLines={1}
adjustsFontSizeToFit
style={{textAlign:'center',fontSize:30}}
>
{this.props.email}
</Text>
</View>
Udało mi się to pokonać, wykonując następujące czynności.
Wybierz rozmiar czcionki, który chcesz dla bieżącego widoku, który masz (upewnij się, że wygląda dobrze dla bieżącego urządzenia, którego używasz w symulatorze).
import { Dimensions } from 'react-native'
i zdefiniuj szerokość poza komponentem w następujący sposób: let width = Dimensions.get('window').width;
Teraz console.log (width) i zapisz go. Jeśli dobrze wyglądająca czcionka ma rozmiar 15, a szerokość to na przykład 360, weź 360 i podziel przez 15 (= 24). To będzie ważna wartość, która będzie dostosowywana do różnych rozmiarów.
Użyj tego numeru w swoim obiekcie stylów w następujący sposób: textFontSize: { fontSize = width / 24 },...
Teraz masz responsywny rozmiar czcionki.
react-native-text
.
Możemy użyć układu elastycznego i dostosowaćsFontSizeToFit = {true} do responsywnych rozmiarów czcionek, a tekst dostosuje się do rozmiaru kontenera.
<Text
adjustsFontSizeToFit
style={styles.valueField}>{value}
</Text>
Ale w stylach musisz również ustawić rozmiar czcionki, tylko wtedy będzie działać dopasowaniesFontSizeToFit.
valueField: {
flex: 3,
fontSize: 48,
marginBottom: 5,
color: '#00A398',
},
Niedawno natknąłem się na ten problem i skończyło się na użyciu arkusza stylów React-Native-Extended
Możesz ustawić rem
wartość i dodatkowe warunki rozmiaru w oparciu o rozmiar ekranu. Zgodnie z dokumentacją:
// 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
});
Dlaczego nie używać PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);
, to jest to samo, co pd
jednostki w systemie Android.
import { Dimensions } from 'react-native';
const { width, fontScale } = Dimensions.get("window");
const styles = StyleSheet.create({
fontSize: idleFontSize / fontScale,
});
fontScale
uzyskaj skalę zgodnie z urządzeniem .
Muszę używać w ten sposób. Użyłem tego i działa dobrze.
reaguj-natywny-responsywny-ekran npm zainstaluj reaguj-natywny-responsywny-ekran - zapisz
Tak jak mam urządzenie 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%")
Działa na wszystkich urządzeniach
U mnie zadziałało nieco inne podejście: -
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
};
Skorzystaj z opcji Pixel Ratio, ponieważ pozwala to lepiej skonfigurować funkcję w oparciu o gęstość urządzenia.
Możesz użyć czegoś takiego.
var {wysokość, szerokość} = Dimensions.get ('okno'); var textFontSize = width * 0,03;
inputText: {
color : TEXT_COLOR_PRIMARY,
width: '80%',
fontSize: textFontSize
}
Mam nadzieję, że to pomoże bez instalowania bibliotek innych firm.
Text.defaultProps.allowFontScaling=false