React Native
How do I handle font scaling in React Native?
React Native text scales with the phone's text size setting by default, because allowFontScaling is true. Keep it on so people who need larger text can read your app, cap tight spots with maxFontSizeMultiplier, and read useWindowDimensions().fontScale to adjust layouts as text grows.
Updated October 31, 2026
If your layout looked right until someone with a larger text size opened it, and now labels wrap, buttons overflow, or text gets cut off, nothing is broken. React Native text follows the text size the user picked in their phone’s settings by default, so the font sizes in your styles are a starting point, and your layout has to make room when they grow.
How it works
Text and TextInput both have allowFontScaling, which is true by default. With it on, each font size you set is multiplied by the user’s font scale. You can read that multiplier with useWindowDimensions().fontScale, which updates when the setting changes, or with PixelRatio.getFontScale(). On Android it comes from Settings > Display > Font size, and on iOS from Settings > Display & Brightness > Text Size, which can go larger under Accessibility > Display & Text Size > Larger Text.
We’d keep scaling on. Turning it off with allowFontScaling={false} keeps the app tidy at the default size, but it leaves the people who chose larger text because they need it with text they can’t read. It’s better to let text grow and fix the few places where that breaks the layout.
How to fix it
-
Cap the spots that can’t grow much, like tab labels or a badge, with
maxFontSizeMultiplier. A value of 1 or more sets the cap, and 0 means no cap:<Text style={styles.tabLabel} maxFontSizeMultiplier={1.3}> Home </Text> -
Set a cap across the app with your own text component. Older answers suggest
Text.defaultProps, but since React 19,defaultPropsno longer works on function components, which includesText, so it has no effect. A small wrapper works instead:import { Text, type TextProps } from "react-native"; export function AppText(props: TextProps) { return <Text maxFontSizeMultiplier={1.5} {...props} />; }Because
propscomes last, a screen can still pass its ownmaxFontSizeMultiplier. -
Let containers grow with the text. Replace fixed
heightvalues on anything that holds text withminHeightand padding, so a row gets taller instead of clipping its label. -
Change the layout when the scale is large. Side-by-side rows that fit at normal size can need to stack:
const { fontScale } = useWindowDimensions(); const stacked = fontScale > 1.3; <View style={{ flexDirection: stacked ? "column" : "row", gap: 8 }}> <Text>Delivery</Text> <Text>Tomorrow, 9 to 11 am</Text> </View>; -
For a one-line label that has to fit, add
adjustsFontSizeToFitwithnumberOfLines={1}, which shrinks the text to fit its space rather than cutting it off.
If you were looking for text that resizes with the screen width, that’s a separate idea from font scaling. Keep allowFontScaling on if you do it, so the user’s setting still applies on top of your size.
How you know it works
On a test phone with the text size set to its largest, walk through the main screens of your app. Text is bigger everywhere, nothing is clipped or overlapping, and the capped labels grow only up to their limit.
If text still gets cut off
Look for a fixed height or width on a parent view, or a numberOfLines that truncates text you didn’t mean to limit. TextInput scales too and accepts the same maxFontSizeMultiplier, so a search field with a fixed height can clip its own text. Images don’t follow the font scale, so if one sits beside a label, size it with fontScale as well to keep the two in proportion.
Ask the agent
If your app is in Draftbit, paste this into the agent, and it can read your code and make the change for you.
Make my app work with large text sizes. Keep font scaling on, cap tab labels and buttons with maxFontSizeMultiplier, remove fixed heights that cut text off, and stack rows vertically when the font scale is large. Then check the main screens with the largest text setting.