The Gesture-First Era
Modern smartphones have eliminated most physical buttons. Navigation is driven almost entirely by touch gestures: swipe to go back, swipe up to go home, swipe down for notifications, pinch to zoom. Both iOS and Android have committed to gesture-based navigation as the default.
This creates a significant challenge for app developers. Your custom gestures must coexist with system gestures without conflicts. Understanding which gestures belong to the system and which are available for your app is fundamental to good mobile UX.
System Gestures You Cannot Override
iOS System Gestures
| Gesture | Action | Zone |
|---|---|---|
| Swipe from left edge | Back navigation | Left 20pt edge |
| Swipe up from bottom | Home / App Switcher | Bottom edge |
| Swipe down from top-left | Notification Center | Top-left corner |
| Swipe down from top-right | Control Center | Top-right corner |
| Long press on space bar | Cursor trackpad | Keyboard area |
iOS prioritizes system gestures. If your app uses a left-edge swipe for something other than back navigation, users will be confused.
Android System Gestures (Gesture Navigation Mode)
| Gesture | Action | Zone |
|---|---|---|
| Swipe from left/right edge | Back | Both side edges |
| Swipe up from bottom | Home | Bottom edge |
| Swipe up and hold | Recent Apps | Bottom edge |
| Swipe down from top | Notification shade | Top edge |
Android's back gesture uses both edges, which is more restrictive than iOS. Apps relying on side-edge drawer gestures must handle this conflict carefully.
Standard App Gestures
These are universally understood and should behave consistently: Tap to select or activate. Long press for context menu or drag initiation. Horizontal swipe for delete/archive on list items or page navigation. Vertical swipe for scroll, pull-to-refresh, or dismiss sheets. Pinch for zoom. Double tap for zoom-to-fit or like (social apps).
Handling Gesture Conflicts
The Edge Swipe Problem
The most common conflict is between system back gesture and in-app side gestures (drawers, galleries, swipeable pages). On iOS, the system back gesture takes priority on the left edge. Do not fight it. On Android, use WindowInsetsControllerCompat to adjust gesture insets on screens where side swipes are critical.
Scroll vs Swipe
When a horizontal carousel sits inside a vertical scroll view, gesture interpretation is ambiguous. Lock to the axis receiving the most initial movement (first 10-15 pixels). Once locked, ignore the other axis until the gesture ends.
Nested Scrolling
A scrollable list inside a bottom sheet inside a scroll view: the innermost view gets priority while it has content to scroll. When it reaches the boundary, the gesture transfers to the parent. Both platforms provide coordinated scrolling APIs.
Custom Gesture Design
Discoverability
Gestures are invisible. Solve this with peek animations showing what is behind a swipe, one-time coach marks, physical affordances like visible drag handles, and contextual hints ("Swipe left to delete") that disappear after first use.
Reversibility
Every gesture should be reversible. Swipe delete needs undo. Pinch zoom needs pinch out. Drag to move needs the ability to drag back.
Progressive Resistance
When a gesture reaches a boundary, add increasing resistance rather than a hard stop. This rubber-band effect is a hallmark of iOS and provides natural feedback about limits.
Platform Implementation
iOS: UIGestureRecognizer family (Tap, LongPress, Pan, Swipe, Pinch, Rotation). Use require(toFail:) for priority. SwiftUI provides .gesture(), .simultaneousGesture(), and .highPriorityGesture().
Android: GestureDetectorCompat for standard detection, ScaleGestureDetector for pinch. Compose provides Modifier.pointerInput(), detectDragGestures(), and detectTransformGestures().
Gesture Accessibility
Not all users can perform complex gestures. Every gesture action must have a button or menu alternative. Support Switch Control (iOS) and Switch Access (Android). Maintain 44x44pt minimum touch targets. Test with VoiceOver enabled, which completely changes gesture semantics.
Testing
Test one-handed with thumb reach on large phones. Test with screen protectors that may reduce sensitivity. Test gesture priority when multiple recognizers could fire. Test with accessibility features enabled.