SafeAreaView — 安全域とは何か、React Native での Safe Area レイアウト

著者: IT Sectr 公開日: 2026-07-06 読了時間: 10 分

SafeAreaView は、ノッチや丸みのあるデバイスで画面の安全領域を考慮したレイアウトを実現する React Native コンポーネントです。Notch や Dynamic Island を備えた iPhone では、コンテンツがカメヤやインジケーターに重なる可能性があります。SafeAreaView は自動的にパディングを追加し、システム要素によりインターフェースが切り取られるのを防ぎます。Safe Area の詳細は、Meta 公式ドキュメントをご覧ください。

まとめ

  • SafeAreaView — iOS および Android 画面で安全領域に対して自動的にパディングを追加するコンポーネント
  • Notch および Dynamic Island には上部のパディングが必要で、SafeAreaView が自動計算します
  • Android — コンポーネントはステータスバーとシステムナビゲーションボタンを考慮します
  • 代替案: react-native-safe-area-context の useSafeAreaInsets で柔軟なパディング制御が可能
  • Edge-to-edge ディスプレイは正しいレイアウトのために SafeAreaView の使用が必須

SafeAreaView とは何か?

SafeAreaView は、システムインターフェース要素(ステータスバー、Notch、Dynamic Island、システムナビゲーションバー)によってコンテンツが重ならないように、自動的に内部パディングを追加する React Native コンポーネントです。このコンポーネントは React Native 0.50 で iOS 向けに登場し、後に Android に拡張されました。

iOS では、SafeAreaView は iOS 11 (2017) で導入されたネイティブの UIView.safeAreaInsets を使用します。Android では、コンポーネントは WindowInsets — Android 5.0 (API 21) 以降利用可能なシステムインセットを考慮します。Apple (2026) によると、アクティブな iPhone の 92% がノッチまたは Dynamic Island を備えています。

Safe Area が必要な理由

Safe Area の概念は、Apple HIG(Human Interface Guidelines)の推奨の一部です。iPhone X (2017) 以前は、画面のすべての領域が安全でした。Notch の登場により、Apple はコンテンツを配置すべきでない領域を定義しました: カメラの切り込み、時計とバッテリー表示、ホームインジケーターです。Android は 2018 年のノッチ付きディスプレイの登場に伴い、同様の概念を導入しました。

iOS および Android での Safe Area の仕組み

iOS では、SafeAreaView がネイティブのレイアウトガイドから safeAreaInsets を読み取ります。上部のインセットにはステータスバーの高さ(通常、Notch ありの iPhone では 44 または 50 ポイント)が含まれます。下部のインセットは、ホームインジケーターの 34 ポイントです。Android は WindowInsets — ステータスバーの上部インセットとシステムナビゲーションの下部インセットを使用します。

プラットフォーム上部インセット下部インセット
iOS (Notch あり)44-50 pt34 ptsafeAreaInsets.top / .bottom
iOS (Notch なし)20 pt0 ptsafeAreaInsets.top / .bottom
Android (ノッチあり)24-48 dp24-48 dpWindowInsets.systemBarsInsets
Android (ノッチなし)24 dp0 dpWindowInsets.statusBarsInsets

重要: SafeAreaView は自動的にパディングを適用しますが、ルートコンテナにのみ適用されます。ネストされたコンポーネントは保護されません — 各画面に独自の SafeAreaView が必要です。モーダルウィンドウや BottomSheet の場合は、インセットを別途考慮してください。

Notch、Dynamic Island およびシステムバー

Notch は、画面上部にあるカメラとセンサーを含むハードウェアの切り込みです。iPhone X (2017) で登場しました。Dynamic Island は、iPhone 14 Pro 以降のソフトウェアハードウェア領域であり、Notch を可変要素で置き換えます。どちらも 50-56 pt の上部インセットが必要です。

Android では、ノッチにはいくつかの形態があります: 涙形、パンチホール、カメラの下のストリップです。Android の SafeAreaView は、ノッチの形状を考慮した WindowInsets を使用します。ランドスケープ向けアプリでは、コンテンツがシステム要素と重ならないよう、侧部インセットが追加されます。

js
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 の使用法と代替案

SafeAreaView は、コンテンツを保護する最も簡単な方法ですが、常に柔軟とは限りません。このコンポーネントは全ての端に同じパディングを適用するため、端によって異なるパディングが必要な場合は不便です。例えば、侧部のパディングが不要な一方、下部のパディングがボタンのためにのみ必要な場合があります。

主な代替案: react-native-safe-area-context の useSafeAreaInsets (最も柔軟な解決策)、Android の StatusBar.currentHeight、デバイスモデルを手動確認する Platform.OS。複雑な場合は、全体のコンテナに SafeAreaView、個々の要素に useSafeAreaInsets を組み合わせて使用してください。

js
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 ライブラリは、React Native で Safe Area を扱うための事実上の標準です。Expo、React Navigation、大多数の UI キットがサポートしています。関数的アプローチとクラスベースのアプローチの両方に対して、hook および Consumer コンポーネントの両方を提供します。

完全制御のための react-native-safe-area-context

react-native-safe-area-context は、ビルトインの SafeAreaView よりも柔軟な API を提供するライブラリです。主な利点は、useSafeAreaInsets フックを介して個々のインセット値 (top、bottom、left、right) にアクセスできることです。これにより、インセットを選択的に適用できます。

また、ライブラリは SafeAreaProvider — アプリケーションの最上位レベルで必須のコンポーネントを提供します。画面を回転シタイムやキーボードを開く際に、システムのインセット変更にサブスクライブします。React Navigation はデフォルトでこのライブラリを使用しています。

react-native-safe-area-context の SafeAreaView はビルトインと異なります: より多くのデバイスで動作し、インセット変更のアニメーションをサポートします。新規プロジェクトでは、このライブラリを依存関係としてインストールし、ビルトインの代わりにこちらの SafeAreaView を使用することをおすすめします。

SafeAreaView 使用時の一般的な誤り

SafeAreaView は、よく間違った使いかたをされます。まず、すべてのコンポーネントを SafeAreaView で囲むことで、重複のパディングが生じます。ルール: 画面のルート View に 1 つの SafeAreaView です。ネストされたコンポーネントは、Flex レイアウトを通じてインセットを継承します。

二つ目は、Android を無視することです。Android では、SafeAreaView は OS バージョンによって異なる可能性のある WindowInsets を使用します。Android 15+ では、システムバーが透明になり、インセットが変わる可能性があります。必ず実機で SafeAreaView をテストし、エミュレータだけでは行わないでください。

三つ目は、ハードコードされたパディングです。Platform.OS === 'ios' ? 44 : 24 を使用しないでください — インセット値はモデルや OS バージョンによって異なります。常にシステム API を使用してください: safeAreaInsets または useSafeAreaInsets です。iPhone 15 Pro の Dynamic Island は、iPhone X の Notch とは異なるインセットを持ちます。

よくある質問

SafeAreaView はすべてのデバイスで動作しますか?

SafeAreaView は iOS 11+ および Android 5+ で動作します。古いデバイスでは、インセットがゼロになりますが、エラーにはなりませんが、手動調整が必要になる場合があります。最大限の互換性をもたらすには、react-native-safe-area-context を使用してください。

上部のみに SafeAreaView を使用し、下部のパディングを無くするには?

ビルトインの SafeAreaView は端を選択できません。react-native-safe-area-context の useSafeAreaInsets を使用してください: insets.top を取得し、paddingTop を適用します。または、下部のインセットをキャンセルするために SafeAreaView を負のマージンの View で囲みます。

Android で SafeAreaView がパディングを追加しないのはなぜ?

一部の Android デバイスでは、メーカー設定により SafeAreaView が動作しない場合があります。React Native 0.64+ を使用していることを確認してください。確実に動作させるには、react-native-safe-area-context をインストールし、アプリを SafeAreaProvider で囲んでください。

画面の向きは SafeAreaView に影響しますか?

はい、画面を回転すると、SafeAreaView がインセットを再計算します。Notch ありの iPhone でランドスケープの場合、侧部インセットが 0 になり、上部インセットは保たれます。react-native-safe-area-context コンポーネントは自動的に向きの変更にサブスクライブします。

SafeAreaView と StatusBar の違いは?

SafeAreaView は、すべてのシステム要素(ステータスバー、Notch、ホームインジケーター)からのコンテンツインセットを管理します。StatusBar は、ステータスバーの色、スタイル、可視性を制御するコンポーネントです。両者は異なる任務を解決し、一緒に使用できます。

まとめ

  • SafeAreaView — iOS (Notch、Dynamic Island) および Android (ステータスバー、ナビゲーション) でシステムインセットを自動計算する React Native コンポーネント
  • 仕組み — safeAreaInsets (iOS) または WindowInsets (Android) を読み取り、ルートコンテナにパディングとして適用
  • Notch および Dynamic Island には 44-56 pt の上部インセット、iPhone のホームインジケーターに 34 pt の下部インセットが必要
  • react-native-safe-area-context — useSafeAreaInsets フックでインセットを選択的に適用できる柔軟な代替案
  • 一般的な誤り: 重複パディング、システム API の代わりにハードコードされたパディング、Android の特徴を無視
  • Edge-to-edge ディスプレイ には、可変要素を正しく配置するために SafeAreaView が必要
  • 画面あたり 1 つの SafeAreaView — ネストされたラッパーはパディングが重複してレイアウトが崩れる

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください