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.
ios
reactjs
react-native
Sydney Loteria
źródło
źródło
Text.defaultProps.allowFontScaling=false
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), }, };
źródło
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 .
Edycja: Pomyślałem, że pomocne może być wyodrębnienie tych funkcji do ich własnego pakietu npm, który również dołączyłem
ScaledSheet
do pakietu, który jest automatycznie skalowaną wersją programuStyleSheet
. Możesz go znaleźć tutaj: reaguj-natywny-rozmiar-sprawy .źródło
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.
źródło
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 swojejPixelRatio
lub innych cech urządzenia.Następnie otrzymujesz style w stosunku do twojego
rem
, nie tylko fontSize, ale także dopełnienia itp .:Ekspansja:
f5
jest zawsze twoim podstawowym rozmiarem czcionkipa2
daje dopełnienie względem twojego podstawowego rozmiaru czcionki.źródło
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}
źródło
adjustsFontSizeToFit
inumberOfLines
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>
źródło
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.
źródło
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.
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', },
źródło
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 });
źródło
Dlaczego nie używać
PixelRatio.getPixelSizeForLayoutSize(/* size in dp */);
, to jest to samo, copd
jednostki w systemie Android.źródło
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 .źródło
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
źródło
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.
źródło
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.
źródło