Drawer — що це, DrawerLayout та бічне меню в додатках

Автор: IT Sectr Опубліковано: 2026-02-23 Час читання: 12 хв

Drawer (Navigation Drawer) — інтерактивна панель, що висувається з лівого (або правого) краю екрана та відображає навігаційні посилання. На Android реалізується через DrawerLayout, на iOS — через кастомні рішення на кшталт SideMenu або стандартний UISplitViewController на iPad. Докладніше про специфікацію читайте в документації Material Design 3.

Головне

  • Drawer — бічне меню навігації, що висувається по свайпу або натисканню на іконку «гамбургер»
  • DrawerLayout — стандартний контейнер Android для реалізації висувного меню
  • SideMenu — популярна бібліотека iOS для кастомізованого бічного меню
  • Modal Drawer — перекриває контент, використовується для фокусу на навігації
  • Standard Drawer — зсуває контент вправо, залишаючи частину видимою

Що таке Drawer?

Drawer (Navigation Drawer) — елемент навігації у вигляді панелі, що висувається з лівого краю екрана по жесту свайпу або натисканню на іконку «гамбургер» (три горизонтальні лінії). Drawer містить навігаційні посилання, заголовок та опціональні елементи: аватар користувача, лічильники сповіщень, роздільники. Панель може перекривати контент (Modal) або зсувати його (Standard).

Material Design 3 (2026) визначає Navigation Drawer як компонент для додатків із 6+ навігаційними пунктами. На відміну від Bottom Navigation, Drawer не займає постійне місце на екрані та показується лише за запитом користувача. Це звільняє простір для контенту, але вимагає додаткової дії для відкриття. Google рекомендує Drawer для додатків із глибокою ієрархією розділів.

Дослідження UX Planet (2025) показало: Drawer підходить для додатків із 5–15 розділами, але час навігації на 40% вищий, ніж при Bottom Navigation. Користувачі пропускають пункти меню, розташовані нижче згину екрана (scroll). Тому важливі розділи мають бути у верхній частині Drawer, а менш важливі (Про додаток, Налаштування) — у нижній, відокремлені роздільником.

Типи Drawer: Modal та Standard

Modal Drawer висувається поверх контенту, затемняючи фон. Використовується для мобільних пристроїв, де екран обмежений по ширині. Після вибору пункту Drawer автоматично закривається. Standard Drawer (Permanent) — фіксована панель, видима постійно, що зсуває контент. Використовується на планшетах та десктопі з шириною екрана від 900 dp. Material 3 також визначає Rail Drawer — компактна версія для планшетів, що показує лише іконки.

ТипПоведінкаВикористання
ModalПерекриває контент, затемняє фонТелефони, тимчасова навігація
StandardЗсуває контент, фіксованийПланшети, десктоп (900+ dp)
RailКомпактна бічна панель з іконкамиПланшети, адаптивна навігація

DrawerLayout в Android

DrawerLayout — стандартний ViewGroup в Android, що реалізує висувне бічне меню. DrawerLayout містить два дочірніх елементи: перший — основний контент (FrameLayout з NavHostFragment), другий — NavigationView з меню. DrawerLayout обробляє жести свайпу та програмне відкриття/закриття через ActionBarDrawerToggle.

kotlin
// Активіті з DrawerLayout та NavigationView
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var drawerLayout: DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        drawerLayout = binding.drawerLayout
        val navView = binding.navView
        val navController = findNavController(R.id.nav_host_fragment)

        // Зв'язування Drawer з Navigation Component
        NavigationUI.setupActionBarWithNavController(
            this, navController, drawerLayout
        )
        NavigationUI.setupWithNavController(navView, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(
            findNavController(R.id.nav_host_fragment),
            drawerLayout
        )
    }
}

// XML: activity_main.xml
// <androidx.drawerlayout.widget.DrawerLayout
//   android:id="@+id/drawerLayout"
//   ...>
//   <!-- Основний контент -->
//   <FrameLayout android:id="@+id/nav_host_fragment"
//     android:layout_width="match_parent"
//     android:layout_height="match_parent" />
//   <!-- Navigation Drawer -->
//   <com.google.android.material.navigation.NavigationView
//     android:id="@+id/navView"
//     android:layout_width="wrap_content"
//     android:layout_height="match_parent"
//     android:layout_gravity="start"
//     app:menu="@menu/nav_menu" />
// </androidx.drawerlayout.widget.DrawerLayout>

NavigationView — компонент Material Design для вмісту Drawer. Він підтримує заголовок (headerLayout), пункти меню (menu), підзаголовки, чекбокси та перемикачі. Атрибут app:menu вказує на XML-меню з пунктами навігації. NavigationUI автоматично підсвічує активний пункт та синхронізує стан з NavController.

Бічне меню в iOS

В iOS немає вбудованого компонента «Drawer» — Apple не рекомендує бічне меню для iPhone (HIG, 2026). Однак для iPad використовується UISplitViewController з primary та secondary панелями. Для iPhone бічне меню реалізується через сторонні бібліотеки (SideMenu, SwiftUI-side-menu) або кастомні рішення з offset контенту. В SwiftUI бічне меню створюється через ZStack з анімацією offset.

swift
import SwiftUI

struct DrawerView<Content: View, Menu: View>: View {
    let menuWidth: CGFloat = 280

    @Binding var isOpen: Bool
    @ViewBuilder let content: Content
    @ViewBuilder let menu: Menu

    var body: some View {
        ZStack(alignment: .leading) {
            content
                .offset(x: isOpen ? menuWidth : 0)
                .animation(.easeInOut, value: isOpen)

            if isOpen {
                menu
                    .frame(width: menuWidth)
                    .transition(.move(edge: .leading))

                Color.black.opacity(0.3)
                    .ignoresSafeArea()
                    .onTapGesture { isOpen = false }
            }
        }
    }
}

// Використання
struct ContentView: View {
    @State private var showDrawer = false

    var body: some View {
        DrawerView(isOpen: $showDrawer) {
            NavigationStack {
                HomeView()
                    .toolbar {
                        ToolbarItem(placement: .navigationBarLeading) {
                            Button(action: { showDrawer.toggle() }) {
                                Image(systemName: "line.horizontal.3")
                            }
                        }
                    }
            }
        } menu: {
            DrawerMenuView()
        }
    }
}

Для production-проектів на iOS часто використовується бібліотека SideMenu (GitHub, 8k+ зірок). Вона надає готовий UIViewController з підтримкою жестів, блюру фону, кастомної ширини та анімацій. SideMenu підтримує ліве та праве меню, множинні рівні та інтеграцію з UIKit через UINavigationController. Альтернатива — UISplitViewController на iPad (системний, без кастомних анімацій).

Кастомізація Drawer: заголовок, іконки, секції

Drawer допускає широку кастомізацію. В Android NavigationView підтримує headerLayout — кастомний layout, розміщуваний над пунктами меню. У ньому розміщують аватар, ім'я користувача, email та обкладинку. Пункти меню групуються через <menu> з підзаголовками, роздільниками та перемикачами. На iOS кастомізація SideMenu включає налаштування кольору фону, блюру, ширини та кутів скруглення.

kotlin
// Кастомний header для NavigationView
val headerView = binding.navView.inflateHeaderView(R.layout.nav_header)
headerView.findViewById<ImageView>(R.id.iv_avatar)
    .setImageResource(R.drawable.avatar)
headerView.findViewById<TextView>(R.id.tv_name)
    .text = "John Doe"

// Налаштування пунктів меню
val menuItem = binding.navView.menu.findItem(R.id.nav_notifications)
menuItem.isChecked = true

// Додавання бейджа
val badge = binding.navView.getOrCreateBadge(R.id.nav_notifications)
badge.number = 15
badge.isVisible = true

Material Design рекомендує наступну структуру Drawer: заголовок (ім'я, аватар), основні навігаційні пункти (5–8), роздільник, другорядні пункти (Налаштування, Допомога), футер (Про додаток, версія). В Material 3 NavigationView також підтримує кастомне підсвічування активного пункту через itemShape та itemBackground.

Коли використовувати Drawer: UX-рекомендації

Drawer ефективний для додатків із 6+ розділами, налаштуваннями та сторінками довідки. Не підходить для додатків, де швидкий доступ до розділів критичний — у таких випадках краще Bottom Navigation. Material Design рекомендує комбінувати Drawer з Bottom Navigation: основна навігація — Bottom (3–5 вкладок), додаткова — Drawer (налаштування, довідка, про додаток).

Основні помилки при реалізації Drawer: перевантажене меню (15+ пунктів без групування), приховування важливих розділів нижче згину, відсутність іконок (текст без іконок повільніше сканується на 30%), анімація із затримками (має бути ≤ 200 ms). Найкращі практики: заголовок з ім'ям користувача, іконки у кожного пункту, роздільники між групами, підсвічування активного розділу, підтримка жесту свайпу для відкриття.

  • 6+ розділів — Drawer виправданий, менше — використовуйте Bottom Navigation
  • Іконки — обов'язкові для кожного пункту, прискорюють візуальний пошук
  • Групування — роздільники між основними та другорядними пунктами
  • Заголовок — аватар, ім'я та email для персоналізації (соціальні додатки)
  • Жест свайпу — обов'язковий для відкриття, дублюється кнопкою «гамбургер»

Часті запитання

Чим Drawer відрізняється від Bottom Navigation?

Drawer — приховане бічне меню, що відкривається жестом, підходить для 6+ розділів та глибокої ієрархії. Bottom Navigation — завжди видима нижня панель для 3–5 розділів. Drawer економить екранний простір, але вимагає додаткової дії для відкриття, що збільшує час навігації на 40%.

Як додати Drawer в SwiftUI?

В SwiftUI немає вбудованого Drawer. Використовуйте ZStack з offset контенту та анімацією, як у прикладі вище. Для production застосовуються бібліотеки: SideMenu (Swift Package) або кастомна обгортка над UISplitViewController. На iPad використовуйте UISplitViewController з preferredDisplayMode .oneBesideSecondary.

Чому Apple не рекомендує Drawer на iPhone?

Apple HIG (2026) стверджує: бічне меню приховує контент і порушує принцип прямої маніпуляції. iOS рекомендує Tab Bar для навігації. Drawer на iPhone використовується лише для налаштувань та додаткових дій, не для основної навігації. На iPad Drawer замінюється UISplitViewController, який є системним стандартом.

Як обробити жест свайпу для Drawer?

В Android DrawerLayout автоматично обробляє свайп від лівого краю. В iOS кастомний Drawer вимагає UIPanGestureRecognizer або Edge Pan Gesture (SwiftUI — .gesture з DragGesture). Важно: свайп має конфліктувати з системним свайпом «Назад» — на iOS лівий край зайнятий системним жестом.

Чи можна зробити Drawer з правого боку?

Так. В Android вкажіть android:layout_gravity="end" для NavigationView. На iOS створіть меню з edge: .trailing. Правосторонній Drawer використовується рідше — для додаткових опцій, фільтрів або чатів. Основна навігація залишається зліва відповідно до Material Design та очікувань користувачів.

Підсумки

  • Drawer — бічне меню навігації для 6+ розділів, що висувається по свайпу або натисканню на «гамбургер»
  • DrawerLayout (Android) — стандартний ViewGroup з інтеграцією Navigation Component через NavigationUI
  • SideMenu (iOS) — популярна бібліотека для кастомного Drawer, оскільки Apple не надає вбудованого компонента
  • Modal vs Standard — Modal перекриває контент (телефони), Standard зсуває контент (планшети 900+ dp)
  • Кастомізація — заголовок з аватаром, групування пунктів, бейджі, підсвічування активного розділу
  • UX — Drawer на 40% повільніший за Bottom Navigation, але необхідний для додатків з глибокою ієрархією
  • Material 3 — NavigationView підтримує стилі, іконки, бейджі та кастомний header layout

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також