iPad Patterns
Comprehensive guide for iPadOS-specific development patterns. Covers multitasking (Stage Manager, Split View, Slide Over), multi-window support, drag and drop, keyboard shortcuts, pointer interactions, Apple Pencil, and external display support. These patterns differentiate an iPad-optimized app from a scaled-up iPhone app.
When This Skill Activates
- User is building or reviewing iPad-specific features
- User asks about Stage Manager, multi-window, or UIScene lifecycle
- User needs drag and drop (NSItemProvider, Transferable, UIDragInteraction)
- User wants keyboard shortcuts or discoverability overlay
- User asks about pointer/trackpad interactions or hover effects
- User is implementing Apple Pencil or PencilKit support
- User needs adaptive layouts for Split View, Slide Over, or size classes
- User asks about external display support
- User wants to make an iPhone app work well on iPad
Decision Tree
What iPad feature are you building?
|
+-- Multi-window / Stage Manager / UIScene lifecycle
| +-- multitasking.md
| +-- Scene configuration, requestSceneSessionActivation
| +-- Window management, scene delegates
|
+-- Split View / Slide Over / Adaptive Layout
| +-- multitasking.md
| +-- Size classes, compact/regular transitions
| +-- NavigationSplitView column widths
|
+-- Drag and Drop
| +-- drag-drop.md
| +-- SwiftUI: .draggable() / .dropDestination()
| +-- UIKit: UIDragInteraction / UIDropInteraction
| +-- Transferable protocol, NSItemProvider
|
+-- Keyboard Shortcuts
| +-- input-methods.md
| +-- SwiftUI: .keyboardShortcut()
| +-- UIKit: UIKeyCommand
| +-- Discoverability overlay (Cmd hold)
|
+-- Pointer / Trackpad Interactions
| +-- input-methods.md
| +-- .hoverEffect(), UIPointerInteraction
| +-- Custom pointer shapes, lift/highlight effects
|
+-- Apple Pencil / PencilKit
| +-- input-methods.md
| +-- PKCanvasView, PKDrawing
| +-- Touch type filtering, Scribble
|
+-- External Display
+-- multitasking.md
+-- WindowGroup for external scenes
+-- UIScreen notifications (legacy)
API Availability
| API |
Minimum Version |
Reference |
UIScene / UISceneDelegate |
iPadOS 13 |
multitasking.md |
UISceneConfiguration |
iPadOS 13 |
multitasking.md |
UIUserInterfaceSizeClass |
iPadOS 8 |
multitasking.md |
NavigationSplitView |
iPadOS 16 |
multitasking.md |
.horizontalSizeClass / .verticalSizeClass |
iPadOS 14 (SwiftUI) |
multitasking.md |
.hoverEffect() |
iPadOS 13 |
input-methods.md |
.keyboardShortcut() |
iPadOS 14 |
input-methods.md |
PencilKit (PKCanvasView) |
iPadOS 13 |
input-methods.md |
.draggable() / .dropDestination() |
iPadOS 16 |
drag-drop.md |
Transferable protocol |
iPadOS 16 |
drag-drop.md |
UIDragInteraction / UIDropInteraction |
iPadOS 11 |
drag-drop.md |
NSItemProvider |
iPadOS 11 |
drag-drop.md |
WindowGroup (multi-window) |
iPadOS 16 (SwiftUI lifecycle) |
multitasking.md |
.handlesExternalEvents |
iPadOS 14 |
multitasking.md |
UISceneSession.requestSceneSessionActivation |
iPadOS 13 |
multitasking.md |
.focusable() / @FocusState |
iPadOS 15 |
input-methods.md |
FocusedValue / FocusedObject |
iPadOS 16 |
input-methods.md |
Top 5 Mistakes
| # |
Mistake |
Fix |
Details |
| 1 |
Ignoring size classes, building fixed layouts |
Use @Environment(\.horizontalSizeClass) to adapt between compact and regular |
multitasking.md |
| 2 |
No keyboard shortcuts for common actions |
Add .keyboardShortcut() to primary actions (Cmd+N, Cmd+S, Delete) |
input-methods.md |
| 3 |
Missing drag and drop on list/grid items |
Add .draggable() and .dropDestination() for content types users expect to move |
drag-drop.md |
| 4 |
No hover effects on interactive elements |
Add .hoverEffect() to buttons, list rows, and custom controls |
input-methods.md |
| 5 |
Not supporting multiple windows (single-scene only) |
Add WindowGroup support and handle NSUserActivity for state restoration |
multitasking.md |
iPad Design Rules (WWDC25)
| Area |
Rule |
| Adaptive navigation |
The tab bar can morph into a sidebar -- use a sidebar for deep or nested content hierarchies, a tab bar when the app is compact and content-forward |
| Immersion |
Run content under the toolbar/sidebar with a scroll edge effect so a floating window still feels edge-to-edge |
| Window controls |
Wrap the toolbar around the window controls on the leading edge instead of reserving a safe-area strip above the content |
| Documents |
Each document opens in ITS OWN window, never "in place" -- and every window gets a unique, descriptive name so the app menu's window list stays navigable |
| Pointer |
Test with the pointer -- it is 1:1 precise with no magnetizing or rubber-banding to targets, so dense hit areas that survive touch forgiveness can still fail |
| Menu bar |
Order menu items by frequency of use (not alphabetically); push secondary actions into submenus; populate the View menu with tabs, their keyboard shortcuts, and sidebar toggles |
Process
1. Identify iPad Features Needed
Read the user's code or requirements to determine:
- Is this a new iPad app or adapting an iPhone app?
- Which iPad-specific features are relevant (multitasking, drag/drop, keyboard, pencil)?
- Target iPadOS version and hardware (Stage Manager requires M1+)
- Whether the app uses SwiftUI lifecycle or UIKit AppDelegate
2. Load Relevant Reference Files
Based on the need, read from this directory:
multitasking.md -- Stage Manager, multi-window, Split View, Slide Over, size classes, external display
input-methods.md -- Keyboard shortcuts, pointer interactions, Apple Pencil, focus system
drag-drop.md -- Drag and drop, Transferable protocol, NSItemProvider
3. Review or Recommend
Apply patterns from the reference files. Check for common issues using the review checklist below.
4. Cross-Reference
- For navigation architecture on iPad, see
ios/navigation-patterns/navigation-split-view.md
- For macOS Catalyst concerns, see
macos/coding-best-practices/
- For toolbar patterns, see
swiftui/toolbars/SKILL.md
- For animation and transitions, see
design/animation-patterns/
Review Checklist
When reviewing code for iPad optimization, verify:
References
1---
2name: ipad-patterns
3description: iPadOS-specific patterns including Stage Manager, multi-window, drag and drop, keyboard shortcuts, pointer interactions, and Apple Pencil support. Use when building iPad-optimized features.
4allowed-tools: [Read, Glob, Grep]
5last_verified: 2026-07-16
6review_by: 2027-06-22
7os_version: iOS 27 / macOS 27
8---
9
10# iPad Patterns
11
12Comprehensive guide for iPadOS-specific development patterns. Covers multitasking (Stage Manager, Split View, Slide Over), multi-window support, drag and drop, keyboard shortcuts, pointer interactions, Apple Pencil, and external display support. These patterns differentiate an iPad-optimized app from a scaled-up iPhone app.
13
14## When This Skill Activates
15
16- User is building or reviewing iPad-specific features
17- User asks about Stage Manager, multi-window, or UIScene lifecycle
18- User needs drag and drop (NSItemProvider, Transferable, UIDragInteraction)
19- User wants keyboard shortcuts or discoverability overlay
20- User asks about pointer/trackpad interactions or hover effects
21- User is implementing Apple Pencil or PencilKit support
22- User needs adaptive layouts for Split View, Slide Over, or size classes
23- User asks about external display support
24- User wants to make an iPhone app work well on iPad
25
26## Decision Tree
27
28```
29What iPad feature are you building?
30|
31+-- Multi-window / Stage Manager / UIScene lifecycle
32| +-- multitasking.md
33| +-- Scene configuration, requestSceneSessionActivation
34| +-- Window management, scene delegates
35|
36+-- Split View / Slide Over / Adaptive Layout
37| +-- multitasking.md
38| +-- Size classes, compact/regular transitions
39| +-- NavigationSplitView column widths
40|
41+-- Drag and Drop
42| +-- drag-drop.md
43| +-- SwiftUI: .draggable() / .dropDestination()
44| +-- UIKit: UIDragInteraction / UIDropInteraction
45| +-- Transferable protocol, NSItemProvider
46|
47+-- Keyboard Shortcuts
48| +-- input-methods.md
49| +-- SwiftUI: .keyboardShortcut()
50| +-- UIKit: UIKeyCommand
51| +-- Discoverability overlay (Cmd hold)
52|
53+-- Pointer / Trackpad Interactions
54| +-- input-methods.md
55| +-- .hoverEffect(), UIPointerInteraction
56| +-- Custom pointer shapes, lift/highlight effects
57|
58+-- Apple Pencil / PencilKit
59| +-- input-methods.md
60| +-- PKCanvasView, PKDrawing
61| +-- Touch type filtering, Scribble
62|
63+-- External Display
64 +-- multitasking.md
65 +-- WindowGroup for external scenes
66 +-- UIScreen notifications (legacy)
67```
68
69## API Availability
70
71| API | Minimum Version | Reference |
72|-----|----------------|-----------|
73| `UIScene` / `UISceneDelegate` | iPadOS 13 | multitasking.md |
74| `UISceneConfiguration` | iPadOS 13 | multitasking.md |
75| `UIUserInterfaceSizeClass` | iPadOS 8 | multitasking.md |
76| `NavigationSplitView` | iPadOS 16 | multitasking.md |
77| `.horizontalSizeClass` / `.verticalSizeClass` | iPadOS 14 (SwiftUI) | multitasking.md |
78| `.hoverEffect()` | iPadOS 13 | input-methods.md |
79| `.keyboardShortcut()` | iPadOS 14 | input-methods.md |
80| `PencilKit` (PKCanvasView) | iPadOS 13 | input-methods.md |
81| `.draggable()` / `.dropDestination()` | iPadOS 16 | drag-drop.md |
82| `Transferable` protocol | iPadOS 16 | drag-drop.md |
83| `UIDragInteraction` / `UIDropInteraction` | iPadOS 11 | drag-drop.md |
84| `NSItemProvider` | iPadOS 11 | drag-drop.md |
85| `WindowGroup` (multi-window) | iPadOS 16 (SwiftUI lifecycle) | multitasking.md |
86| `.handlesExternalEvents` | iPadOS 14 | multitasking.md |
87| `UISceneSession.requestSceneSessionActivation` | iPadOS 13 | multitasking.md |
88| `.focusable()` / `@FocusState` | iPadOS 15 | input-methods.md |
89| `FocusedValue` / `FocusedObject` | iPadOS 16 | input-methods.md |
90
91## Top 5 Mistakes
92
93| # | Mistake | Fix | Details |
94|---|---------|-----|---------|
95| 1 | Ignoring size classes, building fixed layouts | Use `@Environment(\.horizontalSizeClass)` to adapt between compact and regular | multitasking.md |
96| 2 | No keyboard shortcuts for common actions | Add `.keyboardShortcut()` to primary actions (Cmd+N, Cmd+S, Delete) | input-methods.md |
97| 3 | Missing drag and drop on list/grid items | Add `.draggable()` and `.dropDestination()` for content types users expect to move | drag-drop.md |
98| 4 | No hover effects on interactive elements | Add `.hoverEffect()` to buttons, list rows, and custom controls | input-methods.md |
99| 5 | Not supporting multiple windows (single-scene only) | Add `WindowGroup` support and handle `NSUserActivity` for state restoration | multitasking.md |
100
101## iPad Design Rules (WWDC25)
102
103| Area | Rule |
104|------|------|
105| Adaptive navigation | The tab bar can morph into a sidebar -- use a sidebar for deep or nested content hierarchies, a tab bar when the app is compact and content-forward |
106| Immersion | Run content under the toolbar/sidebar with a scroll edge effect so a floating window still feels edge-to-edge |
107| Window controls | Wrap the toolbar around the window controls on the leading edge instead of reserving a safe-area strip above the content |
108| Documents | Each document opens in ITS OWN window, never "in place" -- and every window gets a unique, descriptive name so the app menu's window list stays navigable |
109| Pointer | Test with the pointer -- it is 1:1 precise with no magnetizing or rubber-banding to targets, so dense hit areas that survive touch forgiveness can still fail |
110| Menu bar | Order menu items by frequency of use (not alphabetically); push secondary actions into submenus; populate the View menu with tabs, their keyboard shortcuts, and sidebar toggles |
111
112## Process
113
114### 1. Identify iPad Features Needed
115
116Read the user's code or requirements to determine:
117- Is this a new iPad app or adapting an iPhone app?
118- Which iPad-specific features are relevant (multitasking, drag/drop, keyboard, pencil)?
119- Target iPadOS version and hardware (Stage Manager requires M1+)
120- Whether the app uses SwiftUI lifecycle or UIKit AppDelegate
121
122### 2. Load Relevant Reference Files
123
124Based on the need, read from this directory:
125- `multitasking.md` -- Stage Manager, multi-window, Split View, Slide Over, size classes, external display
126- `input-methods.md` -- Keyboard shortcuts, pointer interactions, Apple Pencil, focus system
127- `drag-drop.md` -- Drag and drop, Transferable protocol, NSItemProvider
128
129### 3. Review or Recommend
130
131Apply patterns from the reference files. Check for common issues using the review checklist below.
132
133### 4. Cross-Reference
134
135- For **navigation architecture** on iPad, see `ios/navigation-patterns/navigation-split-view.md`
136- For **macOS Catalyst** concerns, see `macos/coding-best-practices/`
137- For **toolbar patterns**, see `swiftui/toolbars/SKILL.md`
138- For **animation and transitions**, see `design/animation-patterns/`
139
140## Review Checklist
141
142When reviewing code for iPad optimization, verify:
143
144- [ ] **Size class adaptation** -- UI adapts to compact/regular width (Split View, Slide Over)
145- [ ] **Keyboard shortcuts** -- primary actions have `.keyboardShortcut()` modifiers
146- [ ] **Discoverability** -- shortcuts appear when user holds Command key
147- [ ] **Pointer effects** -- interactive elements have `.hoverEffect()`
148- [ ] **Drag and drop** -- list/grid items support `.draggable()` and `.dropDestination()`
149- [ ] **Multi-window** -- app supports multiple windows if content model allows it
150- [ ] **Scene restoration** -- state is preserved when scene disconnects/reconnects
151- [ ] **Pencil support** -- drawing views filter touch types, PencilKit configured correctly
152- [ ] **Column layout** -- `NavigationSplitView` column widths appropriate for iPad
153- [ ] **No hardcoded widths** -- layouts use `.frame(minWidth:idealWidth:maxWidth:)` or geometry-based sizing
154- [ ] **Context menus** -- long-press context menus on relevant items (also improve right-click with pointer)
155- [ ] **Toolbar placement** -- actions placed in `.primaryAction`, `.secondaryAction`, or `.keyboard` as appropriate
156
157## References
158
159- [Preparing your iPadOS app for multitasking](https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ipados_app_for_multitasking)
160- [Adding drag and drop to a SwiftUI view](https://developer.apple.com/documentation/swiftui/adding-drag-and-drop)
161- [Transferable](https://developer.apple.com/documentation/coretransferable/transferable)
162- [Adding keyboard shortcuts](https://developer.apple.com/documentation/swiftui/adding-keyboard-shortcuts-to-a-swiftui-app)
163- [Pointer interactions](https://developer.apple.com/documentation/uikit/pointer_interactions)
164- [PencilKit](https://developer.apple.com/documentation/pencilkit)
165- [UIScene](https://developer.apple.com/documentation/uikit/uiscene)