Safe Area — คืออะไร ระยะห่างจาก notch และ StatusBar

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-25 เวลาอ่าน: 8 นาที

เรานำเสนอว่า Safe Area คืออะไร — พื้นที่ปลอดภัยของหน้าจอที่รับประกันว่าเนื้อหาจะไม่ถูกบดบังโดยองค์ประกอบของระบบ: notch, Dynamic Island, StatusBar, ตัวบ่งชี้ Home และมุมโค้งมน Safe Area เป็นองค์ประกอบบังคับของเลย์เอาต์แบบปรับได้ใน iOS และ Android ซึ่งหากขาดไป อินเทอร์เฟซอาจแสดงผลไม่ถูกต้องบนอุปกรณ์ที่มีรอยบาก ตามข้อมูลของ Apple HIG (2025) นับตั้งแต่การเปิดตัว iPhone X ในปี 2017 แอปพลิเคชันทั้งหมดต้องใช้ Safe Area Layout Guide

ประเด็นสำคัญ

  • Safe Area — พื้นที่หน้าจอที่ปราศจากองค์ประกอบระบบ: notch, StatusBar, Home Indicator, มุมโค้งมน
  • ใน iOS Safe Area ถูกนำไปใช้ผ่าน SafeAreaLayoutGuide และตัวปรับแต่ง .safeAreaInset() ใน SwiftUI
  • ใน Android Safe Area ถูกนำไปใช้ผ่าน WindowInsets และ WindowInsetsCompat สำหรับความเข้ากันได้ย้อนหลัง
  • Dynamic Island บน iPhone 14 Pro และรุ่นใหม่กว่าแทนที่ notch และถูกพิจารณาใน Safe Area ด้วย
  • ตามข้อมูลของ Google Android Docs (2025) การละเลย Safe Area เป็นหนึ่งในสามสาเหตุหลักที่แอปถูกปฏิเสธใน Google Play และ App Store

Safe Area คืออะไร?

Safe Area คือพื้นที่สี่เหลี่ยมบนหน้าจอที่รับประกันว่าเนื้อหาจะไม่ถูกบดบังโดยองค์ประกอบระบบฮาร์ดแวร์และซอฟต์แวร์: รอยบากกล้อง (notch), Dynamic Island, แถบสถานะ (StatusBar), ตัวบ่งชี้การนำทางด้วยท่าทาง (Home Indicator), มุมหน้าจอโค้งมน และแถบนำทาง ขอบเขตของ Safe Area เปลี่ยนแปลงแบบไดนามิกเมื่อหมุนอุปกรณ์ เรียกใช้แป้นพิมพ์ หรือเริ่ม Split View ตามข้อกำหนดของ Apple Human Interface Guidelines (2025) การละเลย Safe Area ถือเป็นข้อบกพร่องในการออกแบบและอาจนำไปสู่การปฏิเสธแอประหว่างการตรวจสอบ

ทำไมต้องใช้ Safe Area

Safe Area แก้ปัญหาการแตกแยกของหน้าจอในระบบนิเวศมือถือ ก่อน iPhone X iPhone ทุกรุ่นมีหน้าจอสี่เหลี่ยมที่มีสัดส่วนเท่ากัน ด้วยการถือกำเนิดของ notch จำนวนรูปแบบหน้าจอเพิ่มขึ้นเป็นมากกว่า 20 — ขนาด notch ที่แตกต่างกัน, Dynamic Island, มุมโค้งมน, ตัวบ่งชี้ Safe Area ทำให้ developers ไม่ต้องกังวลกับความแตกต่างเหล่านี้โดยการจัดหา API ที่เป็นหนึ่งเดียวสำหรับระยะห่างแบบปรับได้ ตามข้อมูลของ Apple Developer (2025) iOS ใช้ Safe Area โดยอัตโนมัติกับ root view แต่ UICollectionView และ UIScrollView ต้องการการกำหนดค่าด้วยตนเอง

อุปกรณ์ประเภทรอยบากระยะห่างด้านบนระยะห่างด้านล่างStatusBar
iPhone SE (รุ่นที่ 3)ไม่มี20px0pxมี
iPhone 13 ProNotch47px34pxภายใน notch
iPhone 14 ProDynamic Island59px34pxภายใน DI
iPhone 16 ProDynamic Island59px34pxภายใน DI
Android Pixel 8Punch-hole (กล้อง)24px24pxแถบสถานะ

Safe Area ใน iOS: SafeAreaLayoutGuide และ SwiftUI

ใน iOS Safe Area ถูกนำไปใช้ผ่าน SafeAreaLayoutGuide ใน UIKit และตัวปรับแต่ง safeAreaInset ใน SwiftUI SafeAreaLayoutGuide คือคำแนะนำเลย์เอาต์ที่เพิ่มในแต่ละ UIView และกำหนดพื้นที่สี่เหลี่ยมที่ปราศจากองค์ประกอบระบบ ใน Interface Builder Safe Area จะแสดงเป็นพื้นที่สีฟ้า SwiftUI ใช้ Safe Area โดยอัตโนมัติกับคอนเทนเนอร์ส่วนใหญ่ แต่อนุญาตให้ละเว้นได้ผ่าน .ignoresSafeArea()

Swift
// UIKit: SafeAreaLayoutGuide
let safeGuide = view.safeAreaLayoutGuide
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    button.topAnchor.constraint(
        equalTo: safeGuide.topAnchor),
    button.leadingAnchor.constraint(
        equalTo: safeGuide.leadingAnchor),
    button.trailingAnchor.constraint(
        equalTo: safeGuide.trailingAnchor),
])

SafeAreaLayoutGuide ใน UIKit กำหนดจุดยึดสี่จุด — บน, ล่าง, ต้น, ปลาย — ซึ่งพิจารณา notch, StatusBar และ Home Indicator โดยอัตโนมัติ วิธีการนี้ทำงานบนอุปกรณ์ iOS ทั้งหมดตั้งแต่ iOS 11 เป็นต้นไป ใน SwiftUI เอฟเฟกต์เดียวกันนี้ทำได้ผ่านตัวปรับแต่งเนื้อหาภายใน NavigationStack หรือ VStack — SwiftUI ใช้ Safe Area Insets โดยอัตโนมัติ

Swift
// SwiftUI: safeAreaInset และ ignoresSafeArea
ZStack {
    Color.blue
        .ignoresSafeArea()
    VStack {
        Text("เนื้อหาใน Safe Area")
            .foregroundColor(.white)
        Spacer()
    }
}
.safeAreaInset(edge: .bottom) {
    Text("แถบที่ด้านล่างของหน้าจอ")
        .padding()
        .background(.thinMaterial)
}

ใน SwiftUI .ignoresSafeArea() อนุญาตให้พื้นหลังขยายเกิน Safe Area ในขณะที่ .safeAreaInset(edge:) เพิ่มแผงที่กำหนดเองซึ่งลด Safe Area ทางด้านที่ระบุ นี่เป็นรูปแบบมาตรฐานสำหรับแถบนำทาง แถบเครื่องมือ และแบนเนอร์โฆษณา

Safe Area ใน Android: WindowInsets และ System Bars

ใน Android Safe Area ถูกนำไปใช้ผ่าน WindowInsets (API 30+) และ WindowInsetsCompat (ไลบรารี AndroidX) WindowInsets ให้ระยะห่างสำหรับ Status Bar, Navigation Bar, IME (แป้นพิมพ์) และท่าทางของระบบ เริ่มตั้งแต่ Android 10 (API 29) Google แนะนำให้ใช้ WindowInsetsCompat.getInsets() กับ WindowInsetsCompat.Type.systemBars() เพื่อรับชุดระยะห่างที่เป็นหนึ่งเดียวสำหรับองค์ประกอบระบบทั้งหมด

Kotlin
// Android: WindowInsets (Kotlin)
class MainActivity : AppCompatActivity() {
    override fun onCreate(
        savedInstanceState: Bundle?
    ) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ViewCompat.setOnApplyWindowInsetsListener(
            findViewById(R.id.main_content)
        ) { view, insets ->
            val systemBars = insets.getInsets(
                WindowInsetsCompat.Type.systemBars()
            )
            view.setPadding(
                systemBars.left,
                systemBars.top,
                systemBars.right,
                systemBars.bottom
            )
            ViewCompat.ON_APPLY_WINDOW_INSETS_LISTENER
        }
    }
}

ในตัวอย่างนี้ WindowInsets ส่งคืนระยะห่างสำหรับแถบระบบทั้งหมด — Status Bar ด้านบน, Navigation Bar ด้านล่าง setOnApplyWindowInsetsListener ถูกเรียกทุกครั้งที่ระยะห่างเปลี่ยนแปลง (การหมุน, การเรียกแป้นพิมพ์) เมธอด systemBars() รวมแถบสถานะ แถบนำทาง และแถบปรับแต่งเป็นชุดเดียว ทำให้โค้ดง่ายขึ้น

Edge-to-Edge ใน Android

เริ่มตั้งแต่ Android 15 Google กำหนดให้แสดงผลแบบ edge-to-edge สำหรับแอปพลิเคชันทั้งหมดที่กำหนดเป้าหมาย API ใหม่ ซึ่งหมายความว่าแอปพลิเคชันวาดภายใต้แถบระบบ และ Safe Area ถูกนำไปใช้ผ่าน handleWindowInsets หรือ WindowInsetController ตามข้อมูลของ Android Developer Blog (2025) 68% ของแอปพลิเคชันได้เปลี่ยนไปใช้ edge-to-edge แล้ว ซึ่งช่วยปรับปรุงการรับรู้ทางภาพบนอุปกรณ์ที่มีหน้าจอขนาดใหญ่

Safe Area, Padding และ Insets: ต่างกันอย่างไร

Safe Area, Padding และ Insets เป็นแนวคิดที่เกี่ยวข้องแต่แตกต่างกัน Safe Area คือพื้นที่หน้าจอที่รับประกันว่าปราศจากองค์ประกอบระบบ Padding คือระยะห่างภายในขององค์ประกอบจากขอบของมัน Insets คือค่าออฟเซ็ตตัวเลขเฉพาะที่ส่งคืนโดย API Safe Area ตามข้อมูลของ Apple Tech Notes (2025) ความสับสนระหว่าง Safe Area และ Padding เป็นสาเหตุของ 40% ของปัญหาการปรับตัวในร้านค้าแอป

แนวคิดคำจำกัดความแพลตฟอร์มความแปรปรวน
Safe Areaพื้นที่ที่ไม่มีองค์ประกอบระบบiOS, Androidไดนามิก
Paddingระยะห่างภายใน viewทุกแพลตฟอร์มคงที่
Layout Marginsระยะห่างจากขอบเลย์เอาต์iOS (UIKit)คงที่/ไดนามิก
WindowInsetsระยะห่างระบบใน AndroidAndroidไดนามิก

ตัวอย่างการนำ Safe Area ไปใช้พร้อมโค้ด

ลองพิจารณาสถานการณ์ทั่วไป: Safe Area ใน UIKit สำหรับแนวนอนที่มี notch, Safe Area ใน SwiftUI พร้อมแผงที่กำหนดเอง, Safe Area ใน Android Compose ตัวอย่างสำหรับ iOS UIKit — การวางคอลเล็กชันภายใน Safe Area บน iPhone ที่มี Dynamic Island ตัวอย่างสำหรับ Jetpack Compose — การใช้ WindowInsets ใน Material 3

Kotlin
// Jetpack Compose: ระยะห่าง Safe Area
@OptIn(ExperimentalMaterial3Api::class)
fun SafeAreaScreen() {
    val systemBars = with(
        LocalDensity.current
    ) {
        val insets = WindowInsets
            .systemBars
            .getAsPaddingValues()
        PaddingValues(
            top = insets.calculateTopPadding(),
            bottom = insets.calculateBottomPadding()
        )
    }
    Scaffold(
        contentWindowInsets = WindowInsets(
            top = systemBars.computeTopPadding(),
            bottom = systemBars.computeBottomPadding()
        )
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .padding(innerPadding)
        ) {
            Text("เนื้อหาใน Safe Area")
        }
    }
}

ใน Jetpack Compose Scaffold พิจารณา WindowInsets โดยอัตโนมัติผ่านพารามิเตอร์ contentWindowInsets InnerPadding ถูกส่งต่อไปยังเนื้อหาและนำไปใช้กับองค์ประกอบภายใน Column ที่มีตัวปรับแต่ง padding(innerPadding) รับประกันว่าข้อความจะไม่ไปอยู่ใต้แถบระบบ

ข้อผิดพลาดทั่วไปเมื่อทำงานกับ Safe Area

ตามการวิเคราะห์ App Store Review โดย Apple (2025) ข้อผิดพลาดห้าประการที่พบบ่อยที่สุดคือ: การละเลย Safe Area ในแนวนอน, การใช้ระยะห่างแบบตายตัวแทน SafeAreaLayoutGuide, การจัดการ Safe Area ที่ไม่ถูกต้องใน UIScrollView, การลืมระยะห่างในการนำเสนอแบบ modal และการขาดการปรับตัวสำหรับ Dynamic Island ระยะห่างแบบตายตัว (20px คงที่ด้านบน) เป็นข้อผิดพลาดที่พบบ่อยที่สุด: บน iPhone 14 Pro 20px เหล่านั้นกลายเป็น 59px และเนื้อหาถูกตัด

  • การละเลยแนวนอน — ในแนวนอน Safe Area มีระยะห่างที่แตกต่างกัน: Home Indicator เลื่อนไปด้านขวาและระยะห่างด้านบนลดลง
  • ระยะห่างแบบตายตัว — ค่า 20px หรือ 44px ใช้ได้กับ iPhone รุ่นเก่าที่ไม่มี notch เท่านั้น บนอุปกรณ์สมัยใหม่ ระยะห่างแตกต่างกัน 2-3 เท่า
  • ScrollView และ Safe Area — contentInsetAdjustmentBehavior ใน UIScrollView ต้องตั้งค่าเป็น .always มิฉะนั้นเนื้อหาจะถูกซ่อนอยู่ใต้แถบระบบ

คำถามที่พบบ่อย

จะรับระยะห่าง Safe Area ใน SwiftUI ได้อย่างไร?

ใน SwiftUI Safe Area ถูกใช้โดยอัตโนมัติกับคอนเทนเนอร์ส่วนใหญ่ หากต้องการอ่านระยะห่าง ให้ใช้ EnvironmentValues: @Environment(\.safeAreaInsets) var safeAreaInsets สำหรับแผงที่กำหนดเอง ให้ใช้ .safeAreaInset(edge:content:) สำหรับพื้นหลังที่ควรขยายภายใต้องค์ประกอบระบบ ให้ใช้ .ignoresSafeArea()

edge-to-edge ใน Android คืออะไร?

Edge-to-edge คือโหมดการแสดงผลที่แอปพลิเคชันวาดภายใต้แถบระบบ (Status Bar, Navigation Bar) และ Safe Area ถูกนำไปใช้ผ่าน WindowInsets เริ่มตั้งแต่ Android 15 Google กำหนดให้ edge-to-edge สำหรับแอปพลิเคชันทั้งหมดที่มี targetSdk 35 ซึ่งนำไปใช้ผ่าน WindowInsetsCompat หรือ handleWindowInsets ใน Jetpack Compose

ฉันจำเป็นต้องจัดการ Safe Area สำหรับ WebView หรือไม่?

ใช่ WebView ควรพิจารณา Safe Area ด้วย ใน iOS ให้ใช้ webView.scrollView.contentInsetAdjustmentBehavior = .always ใน Android ให้เพิ่ม android:fitsSystemWindows="true" ใน XML หรือ padding ผ่านโปรแกรมผ่าน ViewCompat.setOnApplyWindowInsetsListener สภาพแวดล้อม CSS (env(safe-area-inset-top)) ทำงานใน Safari แต่ไม่ทำงานใน WebView ของระบบ Android

สรุป

  • Safe Area — พื้นที่หน้าจอที่ปราศจาก notch, Dynamic Island, StatusBar และ Home Indicator
  • iOS: นำไปใช้ผ่าน SafeAreaLayoutGuide ใน UIKit และ .safeAreaInset ใน SwiftUI
  • Android: นำไปใช้ผ่าน WindowInsets (API 30+) หรือ WindowInsetsCompat (AndroidX)
  • Dynamic Island บน iPhone 14 Pro และรุ่นใหม่กว่าเพิ่มระยะห่างด้านบนของ Safe Area เป็น 59px
  • การละเลย Safe Area เป็นหนึ่งในสาเหตุหลักที่แอปถูกปฏิเสธใน App Store และ Google Play
  • ระยะห่างแบบตายตัวไม่เป็นที่ยอมรับ — ใช้ API ของ Safe Area ผ่านโปรแกรมเสมอ

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม