SafeAreaView — React Native компонент за оформление, съобразено с безопасната зона на екрана на устройства с прорези и закръгления. На iPhone с Notch и Dynamic Island съдържанието може да бъде закрито от камерата и индикаторите. SafeAreaView автоматично добавя отстояния, предотвратявайки изрязването на интерфейса от системни елементи. Прочетете повече за Safe Area в официалната документация на Meta.
Основни точки
SafeAreaView — React Native компонент, който автоматично добавя вътрешни отстояния (padding), така че съдържанието да не бъде закрито от системните елементи на интерфейса: лента за състояние, Notch, Dynamic Island и системен навигационен панел. Компонентът се появи в React Native 0.50 за iOS и по-късно беше разширен за Android.
На iOS SafeAreaView използва нативния UIView.safeAreaInsets, който се появи в iOS 11 (2017). На Android компонентът взема предвид WindowInsets — системни отстояния, достъпни от Android 5.0 (API 21). Според данни на Apple (2026), 92% от активните iPhone имат дисплей с прорез или Dynamic Island.
Концепцията Safe Area — част от препоръките на Apple HIG (Human Interface Guidelines). Преди iPhone X (2017) цялото пространство на екрана беше безопасно. С появата на Notch Apple определи зони, където съдържанието не трябва да се намира: прорез на камерата, индикатор за време и батерия, домашен индикатор. Android въведе аналогична концепция с появата на дисплеи с прорез през 2018 г.
На iOS SafeAreaView чете safeAreaInsets от нативния layout-guide. Горното отстояние включва височината на лентата за състояние (обикновено 44 или 50 пункта за iPhone с Notch). Долно отстояние — 34 пункта за домашния индикатор (Home Indicator). Android използва WindowInsets — горно отстояние за лентата за състояние и долно за системната навигация.
| Платформа | Горно отстояние | Долно отстояние | Източник |
|---|---|---|---|
| iOS (Notch) | 44-50 pt | 34 pt | safeAreaInsets.top / .bottom |
| iOS (без Notch) | 20 pt | 0 pt | safeAreaInsets.top / .bottom |
| Android (с прорез) | 24-48 dp | 24-48 dp | WindowInsets.systemBarsInsets |
| Android (без прорез) | 24 dp | 0 dp | WindowInsets.statusBarsInsets |
Важно: SafeAreaView прилага padding автоматично, но само за основния контейнер. Вложените компоненти не получават защита — всеки екран трябва да има свой SafeAreaView. За модални прозорци и BottomSheet вземете предвид отстоянията отделно.
Notch — хардуерен прорез в горната част на екрана, съдържащ камера и сензори. Появи се в iPhone X (2017). Dynamic Island — софтуерно-хардуерна зона на iPhone 14 Pro и по-нови, която замества Notch с интерактивен елемент. И двата изискват горно отстояние от 50-56 pt.
На Android прорезите имат различни форми: капковидни, отвор в ъгъла (punch-hole), лента под камерата. SafeAreaView на Android използва WindowInsets, които вземат предвид формата на прореза. За приложения в пейзажна ориентация се добавят странични отстояния, за да не бъде закрито съдържанието от системни елементи.
import React from 'react';
import { SafeAreaView, View, Text } from 'react-native';
const App = () => (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.content}>
<Text>Content is safe from Notch and system bars</Text>
</View>
</SafeAreaView>
);Подходът Edge-to-edge (Android 15+) препоръчва рисуване на съдържание под системните панели, но с отчитане на отстояния за интерактивни елементи. SafeAreaView помага да се поддържа този баланс: фонът се рисува под панелите, а бутоните и текстът — в безопасната зона.
SafeAreaView — най-простият начин за защита на съдържанието, но не винаги гъвкав. Компонентът прилага еднакви отстояния към всички страни, което е неудобно, когато е необходимо различно padding за различни ръбове. Например, страничните отстояния може да са ненужни, а долното — само за бутон.
Основни алтернативи: useSafeAreaInsets от react-native-safe-area-context (най-гъвкавото решение), StatusBar.currentHeight на Android, Platform.OS с ръчна проверка на модела на устройството. За сложни случаи използвайте комбинация от SafeAreaView за общия контейнер и useSafeAreaInsets за отделни елементи.
import { useSafeAreaInsets } from 'react-native-safe-area-context';
const CustomHeader = () => {
const insets = useSafeAreaInsets();
return (
<View style={{ paddingTop: insets.top }}>
<Header />
</View>
);
};Библиотеката react-native-safe-area-context — де факто стандарт за работа със Safe Area в React Native. Поддържа се от Expo, React Navigation и повечето UI комплекти. Предоставя както hook, така и Consumer компонент за функционален и класов подход.
react-native-safe-area-context — библиотека, предоставяща по-гъвкаво API от вградения SafeAreaView. Основното предимство — достъп до отделни стойности на отстояния (top, bottom, left, right) чрез hook-а useSafeAreaInsets, което позволява селективното им прилагане.
Библиотеката също предоставя SafeAreaProvider — компонент, задължителен на най-горното ниво на приложението. Той се абонира за промени в системните отстояния при завъртане на екрана или отваряне на клавиатурата. React Navigation използва тази библиотека по подразбиране.
SafeAreaView от react-native-safe-area-context се различава от вградения: работи на повече устройства и поддържа анимация на промяна на отстоянията. За нов проект се препоръчва инсталиране на тази библиотека като зависимост и използване на нейния SafeAreaView вместо вградения.
SafeAreaView често се използва неправилно. Първата грешка — обвиване на всеки компонент в SafeAreaView, което създава двойни отстояния. Правило: един SafeAreaView за основния View на екрана. Вложените компоненти наследяват отстоянията чрез Flex оформление.
Втората грешка — игнориране на Android. На Android SafeAreaView използва WindowInsets, които могат да се различават на различни версии на ОС. На Android 15+ системните панели могат да бъдат прозрачни и отстоянията се променят. Винаги тествайте SafeAreaView на реални устройства, не само в емулатора.
Третата грешка — твърдо зададено padding. Никога не използвайте Platform.OS === 'ios' ? 44 : 24 — стойностите на отстоянията се променят между моделите и версиите на ОС. Винаги използвайте системни API-та: safeAreaInsets или useSafeAreaInsets. Dynamic Island на iPhone 15 Pro има различни отстояния от Notch на iPhone X.
Често задавани въпроси
SafeAreaView работи на iOS 11+ и Android 5+. На по-стари устройства отстоянията ще бъдат нулеви, което не причинява грешки, но може да изисква ръчна настройка. За максимална съвместимост използвайте react-native-safe-area-context.
Вграденият SafeAreaView не позволява избор на страни. Използвайте useSafeAreaInsets от react-native-safe-area-context: вземете insets.top и приложете paddingTop. Или обвийте SafeAreaView във View с отрицателен margin за компенсиране на долното отстояние.
На някои Android устройства SafeAreaView може да не работи поради настройки на производителя. Проверете дали използвате React Native 0.64+. За гарантирана работа инсталирайте react-native-safe-area-context и обвийте приложението в SafeAreaProvider.
Да, при завъртане на екрана SafeAreaView преизчислява отстоянията. В пейзажна ориентация на iPhone с Notch страничните отстояния може да са 0, а горното остава. Компонентът react-native-safe-area-context автоматично се абонира за промени в ориентацията.
SafeAreaView управлява отстоянията на съдържанието от всички системни елементи (лента за състояние, Notch, домашен индикатор). StatusBar — компонент за контрол на цвета, стила и видимостта на лентата за състояние. Те решават различни задачи и могат да се използват заедно.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също