Drawer (Navigation Drawer) — en interaktiv panel som glider ut från vänster (eller höger) kant på skärmen och visar navigeringslänkar. På Android implementeras det via DrawerLayout, på iOS — via anpassade lösningar som SideMenu eller standard UISplitViewController på iPad. Läs mer om specifikationen i dokumentationen för Material Design 3.
Huvudsakliga
Drawer (Navigation Drawer) — ett navigeringselement i form av en panel som glider ut från vänster kant på skärmen genom en svepgest eller klick på hamburgerikonen (tre horisontella linjer). Drawer innehåller navigeringslänkar, en titel och valfria element: användaravatar, notisräknare, avskiljare. Panelen kan täcka innehållet (Modal) eller flytta det (Standard).
Material Design 3 (2026) definierar Navigation Drawer som en komponent för appar med 6+ navigeringspunkter. Till skillnad från Bottom Navigation tar Drawer ingen fast plats på skärmen och visas endast på användarens begäran. Detta frigör utrymme för innehåll men kräver en extra åtgärd för att öppna. Google rekommenderar Drawer för appar med djup hierarki av sektioner.
Forskning av UX Planet (2025) visade: Drawer passar appar med 5–15 sektioner, men navigationstiden är 40% högre än med Bottom Navigation. Användare missar menyalternativ under skärmens vik (scroll). Därför bör viktiga sektioner vara i den övre delen av Drawer och mindre viktiga (Om appen, Inställningar) — i den nedre delen, åtskilda av en avskiljare.
Modal Drawer — glider över innehållet, mörkar bakgrunden. Används på mobila enheter där skärmen är begränsad i bredd. Efter val av ett alternativ stängs Drawer automatiskt. Standard Drawer (Permanent) — en fast panel, ständigt synlig, som flyttar innehållet. Används på surfplattor och datorer med skärmbredd från 900 dp. Material 3 definierar också Rail Drawer — en kompakt version för surfplattor som endast visar ikoner.
| Typ | Beteende | Användning |
|---|---|---|
| Modal | Täcker innehåll, mörkar bakgrund | Telefoner, tillfällig navigering |
| Standard | Flyttar innehåll, fast | Surfplattor, datorer (900+ dp) |
| Rail | Kompakt sidopanel med ikoner | Surfplattor, adaptiv navigering |
DrawerLayout — den standard ViewGroup i Android som implementerar en glidande sidomeny. DrawerLayout innehåller två underordnade element: första — huvudinnehållet (FrameLayout med NavHostFragment), andra — NavigationView med meny. DrawerLayout hanterar svepgester och programmatisk öppning/stängning via ActionBarDrawerToggle.
// Aktivitet med DrawerLayout och 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)
// Koppla Drawer till 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"
// ...>
// <!-- Huvudinnehåll -->
// <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-komponenten för Drawer-innehåll. Den stöder rubrik (headerLayout), menyalternativ (menu), underrubriker, kryssrutor och flaggor. Attributet app:menu pekar på en XML-meny med navigeringspunkter. NavigationUI markerar automatiskt det aktiva alternativet och synkroniserar tillståndet med NavController.
iOS har ingen inbyggd "Drawer"-komponent — Apple rekommenderar inte sidomeny för iPhone (HIG, 2026). För iPad används dock UISplitViewController med primary och secondary paneler. För iPhone implementeras sidomenyn via tredjepartsbibliotek (SideMenu, SwiftUI-side-menu) eller anpassade lösningar med innehållsförskjutning. I SwiftUI skapas sidomenyn via ZStack med förskjutningsanimation.
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 }
}
}
}
}
// Användning
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()
}
}
}För produktionsprojekt på iOS används ofta biblioteket SideMenu (GitHub, 8k+ stjärnor). Det erbjuder en färdig UIViewController med stöd för gester, bakgrundsoskärpa, anpassad bredd och animationer. SideMenu stöder vänster och höger meny, flera nivåer och integration med UIKit via UINavigationController. Alternativ — UISplitViewController på iPad (systemnivå, utan anpassade animationer).
Drawer tillåter omfattande anpassning. I Android stöder NavigationView headerLayout — en anpassad layout placerad ovanför menyalternativen. Där placeras avatar, användarnamn, e-post och omslag. Menyalternativen grupperas via <menu> med underrubriker, avskiljare och flaggor. På iOS inkluderar anpassning av SideMenu inställning av bakgrundsfärg, oskärpa, bredd och hörnrundning.
// Anpassad header för 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"
// Konfigurera menyalternativ
val menuItem = binding.navView.menu.findItem(R.id.nav_notifications)
menuItem.isChecked = true
// Lägga till märke
val badge = binding.navView.getOrCreateBadge(R.id.nav_notifications)
badge.number = 15
badge.isVisible = trueMaterial Design rekommenderar följande Drawer-struktur: titel (namn, avatar), huvudsakliga navigeringsalternativ (5–8), avskiljare, sekundära alternativ (Inställningar, Hjälp), sidfot (Om appen, version). I Material 3 stöder NavigationView också anpassad markering av det aktiva alternativet via itemShape och itemBackground.
Drawer är effektivt för appar med 6+ sektioner, inställningar och hjälpsidor. Det passar inte för appar där snabb åtkomst till sektioner är kritisk — i sådana fall är Bottom Navigation bättre. Material Design rekommenderar att kombinera Drawer med Bottom Navigation: huvudnavigering — Bottom (3–5 flikar), kompletterande — Drawer (inställningar, hjälp, om appen).
Huvudsakliga misstag vid implementering av Drawer: överbelastad meny (15+ alternativ utan gruppering), döljande av viktiga sektioner under vik, brist på ikoner (text utan ikoner skannas 30% långsammare), animation med fördröjningar (bör vara ≤ 200 ms). Bästa praxis: titel med användarnamn, ikoner vid varje alternativ, avskiljare mellan grupper, markering av aktiv sektion, stöd för svepgest för att öppna.
Vanliga frågor
Drawer — en dold sidomeny som öppnas med en gest, lämplig för 6+ sektioner och djup hierarki. Bottom Navigation — alltid synlig bottenpanel för 3–5 sektioner. Drawer sparar skärmutrymme men kräver en extra åtgärd för att öppnas, vilket ökar navigationstiden med 40%.
SwiftUI har ingen inbyggd Drawer. Använd ZStack med innehållsförskjutning och animation, som i exemplet ovan. För produktion används bibliotek: SideMenu (Swift Package) eller ett anpassat omslag runt UISplitViewController. På iPad använd UISplitViewController med preferredDisplayMode .oneBesideSecondary.
Apple HIG (2026) säger: sidomenyn döljer innehåll och bryter mot principen om direkt manipulation. iOS rekommenderar Tab Bar för navigering. Drawer på iPhone används endast för inställningar och extra åtgärder, inte för huvudnavigering. På iPad ersätts Drawer av UISplitViewController, som är systemstandard.
I Android hanterar DrawerLayout automatiskt svep från vänster kant. I iOS kräver en anpassad Drawer UIPanGestureRecognizer eller Edge Pan Gesture (SwiftUI — .gesture med DragGesture). Viktigt: svepet kan kollidera med systemets "Tillbaka"-svep — på iOS är vänster kant upptagen av systemgesten.
Ja. I Android ställ in android:layout_gravity="end" för NavigationView. I iOS skapa menyn med edge: .trailing. En högersidig Drawer används mer sällan — för extra alternativ, filter eller chattar. Huvudnavigeringen förblir till vänster enligt Material Design och användarnas förväntningar.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också