Реалізація Split View / Slide Over для iPad-програми
iPadOS Multitasking — Split View (два програми рядом), Slide Over (програма в плавучому вікні), Stage Manager (iOS 16+, вікна вільного розміру) — все це працює тільки якщо програма правильно підтримує гнучкі розміри вікна. Програма, розгорнута на iPad без підтримки Multitasking, відображається з темними смугами в компактному режимі і не попадає в список доступних для Split View — це відразу видно як недороботка.
Що потрібно для базової підтримки
Увімкнути Multitasking в Info.plist. Для повної підтримки Split View та Slide Over — видалити UIRequiresFullScreen = YES. Якщо цей ключ встановлений в true, програма примусово займає весь екран і недоступна для Split View.
SceneDelegate та підтримка Multiple Windows — необхідна для Stage Manager:
// Info.plist
// UIApplicationSceneManifest → UISceneConfigurations → UIWindowSceneSessionRoleApplication
// Там же: UIApplicationSupportsMultipleScenes = true
AutoLayout без захардкодених розмірів. Це 90% роботи. Кожен frame, constant та multiplier розраховується від view.bounds — не від магічних 768 або 1024.
Розмірні класи: traitCollection замість hardcode
iPad в Split View змінює horizontalSizeClass з .regular на .compact при вузькому вікні. Код, завязаний на UIDevice.current.userInterfaceIdiom == .pad замість size class, сломається:
// Погано — завязка на пристрій
if UIDevice.current.userInterfaceIdiom == .pad {
showSidebar()
}
// Правильно — завязка на size class
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .regular {
showSidebar()
} else {
hideSidebar()
}
}
У SwiftUI — @Environment(\.horizontalSizeClass):
struct ContentView: View {
@Environment(\.horizontalSizeClass) var sizeClass
var body: some View {
if sizeClass == .regular {
NavigationSplitView {
SidebarView()
} detail: {
DetailView()
}
} else {
NavigationStack {
MainView()
}
}
}
}
NavigationSplitView — нативний компонент для iPad master-detail. Автоматично адаптується під різні size class, підтримує три-колоночний layout (sidebar, content, detail) без ручного управління.
UISplitViewController для UIKit
Для UIKit-програм UISplitViewController — правильний вибір. Важливі властивості:
let split = UISplitViewController(style: .doubleColumn)
split.preferredDisplayMode = .oneBesideSecondary
split.preferredSplitBehavior = .tile
split.presentsWithGesture = true // свайп для скриття sidebar
// Мінімальна ширина primary колонки
split.minimumPrimaryColumnWidth = 280
split.maximumPrimaryColumnWidth = 400
split.preferredPrimaryColumnWidth = 320
style: .tripleColumn для трьохколоночного layout (пошта, сообщения). presentsWithGesture = true дозволяє скривати/показувати sidebar свайпом — очікуване поведення на iPad.
Адаптація при колапсі: коли Split View йде в компактний режим (Slide Over, вузький Split), контролери «сворачуються» в стек. Переопределяємо логіку через делегат:
func splitViewController(
_ svc: UISplitViewController,
topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column
) -> UISplitViewController.Column {
// Показувати sidebar замість detail при collapse, якщо detail пуст
if detailViewController.isEmpty {
return .primary
}
return proposedTopColumn
}
Drag & Drop між колонками
У Split View користувачі очікують Drag & Drop — особливо в продуктивних програмах. UIDropInteraction та UIDragInteraction додаються до View:
let dropInteraction = UIDropInteraction(delegate: self)
targetView.addInteraction(dropInteraction)
func dropInteraction(_ interaction: UIDropInteraction,
performDrop session: UIDropSession) {
session.loadObjects(ofClass: NSString.self) { items in
// Обробляємо дроп
}
}
Для SwiftUI — .onDrop(of:delegate:) та .draggable().
Keyboard та Pointer підтримка
iPad з Magic Keyboard — це трекпад та клавіатура. Без UIPointerInteraction (hover эффекти) та keyboard shortcuts програма виглядає непроробленою на iPad Pro.
// Keyboard shortcut
let command = UIKeyCommand(input: "N", modifierFlags: .command,
action: #selector(newItem),
discoverabilityTitle: "Новий елемент")
addKeyCommand(command)
UIMenuBuilder для додавання пунктів в системне меню (Edit, View), що важливо при роботі з Magic Keyboard.
Ориентири по срокам
| Завдання | Срок |
|---|---|
| Базова Split View підтримка (UISplitViewController) | 1–2 дні |
| Повна адаптація з size class, Drag & Drop | 3–4 дні |
| + Stage Manager + Keyboard shortcuts | +1 день |
| SwiftUI NavigationSplitView з нуля | 2–3 дні |







