Растягивание экрана в React Native¶
Растягивание экрана в React — это адаптация пользовательского интерфейса мобильного приложения под различные размеры экранов, ориентации и плотности пикселей. В экосистеме React Native, ориентированной на создание кроссплатформенных приложений для iOS и Android, задача обеспечения корректного отображения на десятках различных устройств решается сочетанием системного API Dimensions, компонента useWindowDimensions, flex-раскладки и относительных единиц измерения.
¶Основные инструменты
¶Dimensions
Стандартный модуль Dimensions из React Native предоставляет доступ к размерам экрана устройства:
```javascript import { Dimensions } from 'react-native';
const { width, height } = Dimensions.get('window'); ```
Dimensions.get('window') возвращает размеры окна приложения (без учёта системных панелей), а Dimensions.get('screen') — физические размеры экрана. Метод Dimensions.addEventListener('change', handler) позволяет отслеживать изменения размеров, например при повороте устройства.
¶useWindowDimensions
Хук useWindowDimensions из React Native является предпочтительным способом получения размеров в функциональных компонентах. Он автоматически перезапускает рендер при изменении размеров окна, что избавляет от ручной подписки на события:
```javascript import { useWindowDimensions } from 'react-native';
function MyComponent() { const { width, height } = useWindowDimensions(); return <View style={{ width: width * 0.5 }} />; } ```
¶Подходы к адаптации
¶Flexbox-раскладка
React Native использует flexbox по умолчанию, что упрощает создание адаптивных интерфейсов. Основные свойства:
flex: 1— элемент занимает всё доступное пространство;flexGrow,flexShrink,flexBasis— тонкая настройка распределения пространства;justifyContentиalignItems— выравнивание по главной и поперечной осям.
Приоритет отдаётся относительным размерам вместо фиксированных значений в пикселях.
¶Процентные значения
Стили React Native поддерживают проценты для ширины и высоты:
``javascript <View style={{ width: '80%', height: '50%' }} /> ``
Проценты считаются от размеров родительского контейнера, что делает раскладку гибкой.
¶Масштабирование через коэффициент
Популярен подход с вычислением масштабирующего коэффициента относительно базового экрана (например, iPhone 8 с шириной 375 пунктов):
``javascript const scale = width / 375; const scaledSize = (baseSize) => baseSize * scale; ``
Этот приём позволяет пропорционально масштабировать шрифты, отступы и размеры элементов. Для этого часто создают собственные утилиты или переопределяют глобальную функцию normalize.
¶Библиотеки и утилиты
¶react-native-size-matter
Библиотека react-native-size-matter предоставляет функции moderateScale, scale, verticalScale и scaleFont для удобного масштабирования значений относительно эталонного устройства:
```javascript import { s, vs, ms } from 'react-native-size-matters';
<View style={{ width: s(100), height: vs(50), padding: ms(12) }} /> ```
¶react-native-responsive-screen
Пакет react-native-responsive-screen предлагает функции widthPercentageToDP и heightPercentageToDP для задания размеров в процентах от экрана:
```javascript import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen';
<View style={{ width: wp('80%'), height: hp('30%') }} /> ```
¶Ориентация экрана
По умолчанию React Native поддерживает обе ориентации. Ограничение ориентации задаётся в манифестах платформ:
- Android — атрибут
android:screenOrientationвAndroidManifest.xml; - iOS — свойство
supportedInterfaceOrientationsвInfo.plist.
Для программного определения текущей ориентации используется соотношение width / height.
¶Практические рекомендации
- Использовать
useWindowDimensionsвместо прямого вызоваDimensions.getв функциональных компонентах. - Задавать базовые размеры в пунктах (points), а не пикселях — React Native автоматически конвертирует единицы с учётом плотности экрана.
- Избегать фиксированных высот у контейнеров с текстом — перенос строк на разных устройствах может ломать раскладку.
- Тестировать на реальных устройствах с различными диагоналями, а не только в симуляторах.
- Для сложных интерфейсов использовать библиотеки вроде
react-native-size-mattersвместо ручных вычислений.
¶Источники
- Документация React Native: Dimensions API
- Документация React Native: useWindowDimensions
- react-native-size-matter — GitHub-репозиторий
- react-native-responsive-screen — GitHub-репозиторий
