iPadOS — 苹果公司为 iPad 开发的操作系统,于 2019 年从 iOS 分离。iPad 开发考虑了独特的功能:Split View 和 Stage Manager 多任务处理、低延迟的 Apple Pencil 输入和桌面版 Safari。
要点
iPadOS — 苹果公司为 iPad 开发的操作系统,于 2019 年首次作为 iOS(版本 13)的分支发布。在此之前,iPad 使用与 iPhone 相同的 iOS。iPadOS 的分离使苹果能够实现针对大屏幕的特定功能:多任务处理、桌面版 Safari、Drag & Drop 和外接显示器支持。
iPadOS 保持与 iOS 应用的完全兼容:任何 iPhone 应用都可以在 iPad 上以缩放模式运行。然而,为了获得高质量的用户体验,需要进行适配:使用 Size Classes、UISplitViewController 和支持键盘快捷键。根据苹果的数据(WWDC 2025),用户在 iPad 上 80% 的时间花在平板版本上,而不是缩放版本。
iPadOS 13(2019)带来了 Slide Over 和 Split View。iPadOS 14(2020)添加了 Apple Pencil Scribble 和紧凑型 UI。iPadOS 15(2021)引入了 Quick Note 和多任务处理改进。iPadOS 16(2022)推出了 Stage Manager 和外接显示器支持。iPadOS 17(2023)添加了交互式小部件和 Lock Screen 自定义。
| iPadOS 版本 | 年份 | 关键创新 |
|---|---|---|
| iPadOS 13 | 2019 | Slide Over、Split View、桌面版 Safari |
| iPadOS 14 | 2020 | Apple Pencil 的 Scribble、紧凑型通话 |
| iPadOS 15 | 2021 | Quick Note、改进的多任务管理器 |
| iPadOS 16 | 2022 | Stage Manager、6K 外接显示器 |
| iPadOS 17 | 2023 | 交互式小部件、Lock Screen |
| iPadOS 18 | 2024 | Math Notes 计算器、Smart Script |
iPadOS 基于与 iOS 相同的 XNU 内核和 Darwin,但使用了修改后的 UIKit shell,适用于多窗口和任意屏幕尺寸。关键的架构区别 — 支持 UIScene,该功能在 iOS 13 中引入。
在 iPadOS 中,每个窗口(包括 Split View 中的窗口)都是一个独立的 UISceneSession,具有自己的生命周期。与 iPhone 不同,一个应用程序只有一个 UIWindowScene,在 iPad 上,一个应用程序可以有多个 UIScene(多个窗口、Slide Over、Stage Manager)。SceneDelegate 独立管理每个窗口的状态。
import UIKit
import SwiftUI
/// SceneDelegate 用于在 iPadOS 上支持多个窗口
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var splitVC: UISplitViewController?
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// 为平板导航创建 UISplitViewController
let splitVC = UISplitViewController(style: .tripleColumn)
splitVC.primaryBackgroundStyle = .sidebar
let sidebar = SidebarViewController()
let primary = PrimaryViewController()
let detail = DetailViewController()
splitVC.viewControllers = [sidebar, primary, detail]
let window = UIWindow(windowScene: windowScene)
window.rootViewController = splitVC
window.makeKeyAndVisible()
self.window = window
}
// 窗口大小变化时的适配(Split View)
func windowScene(_ windowScene: UIWindowScene,
didUpdate previousCoordinateSpace: UICoordinateSpace,
interfaceOrientation previousOrientation: UIInterfaceOrientation) {
let isMultitasking = windowScene.traitCollection.horizontalSizeClass == .compact
print("iPadOS multitasking mode: \(isMultitasking ? "compact" : "regular")")
}
}使用 .tripleColumn 样式的 UISplitViewController 同时显示三列:sidebar(导航)、primary(列表)和 detail(内容)。在切换到紧凑模式(与另一个应用 Split View)时,UIKit 自动将列折叠到导航堆栈中。开发人员不需要手动管理此行为 — UIKit 通过 traitCollection 调整布局。
在 iPadOS 中可用:通过 Files 支持外部驱动器(USB-C/Thunderbolt)、带有元素检查的 Safari 终端模式、通过 UIKeyCommand 的键盘快捷键、系统下载管理器、应用之间的 Drag & Drop 以及可调节窗口大小的 Picture in Picture。
多任务处理 — iPadOS 的关键功能,使其与 iOS 有根本区别。用户可以在一个屏幕上同时处理多个应用。开发人员必须确保应用在任何多任务模式下都能正常工作。
Split View 将 iPad 屏幕以 50/50 或 33/67 的比例在两个应用之间分割。每个应用都有自己的 UISceneSession,具有自己的内存和生命周期。当屏幕宽度小于 600 点时,UIKit 强制将应用切换到紧凑的水平 size class。应用必须正确处理此更改。
Slide Over — 浮动在活动应用上方的窗口(宽度 320 点)。Slide Over 中的应用切换到紧凑的水平 size class (.compact)。优化 UI 以适应窄屏非常重要。在 Slide Over 中,可以通过从右边缘滑动或通过 Dock 调用应用。用户可以将 Slide Over 拖到 Split View 中,或向右滑动关闭。
Stage Manager(iPadOS 16+,M1 及更新版本)— 一个窗口管理器,允许创建任意大小的重叠窗口。支持在 iPad 屏幕上最多 4 个窗口,在外接显示器上最多 4 个(总共 8 个)。应用会为每个新窗口收到 UISceneWillConnectNotification 事件。Stage Manager 改变了生命周期规则:后台窗口不会被冻结,而是以有限的资源继续运行。
| 模式 | 窗口数 | 窗口大小 | Size Class |
|---|---|---|---|
| 全屏 | 1 | 100% 屏幕 | Regular |
| Split View 50/50 | 2 | 50% 屏幕 | Regular(iPad Pro 12.9)或 Compact |
| Split View 33/67 | 2 | 33% / 67% | 33% 为 Compact |
| Slide Over | 1 + 浮动 | 320 pt | Compact |
| Stage Manager | 1–4 | 任意 | 取决于大小 |
Apple Pencil — 苹果公司的主动式手写笔,支持倾斜、压力和悬停检测(iPad Pro M2+)。笔移动与墨水显示之间的延迟为 9–20 毫秒,具体取决于型号。PencilKit — 用于在应用中集成绘图的主要框架。
PKCanvasView 提供现成的绘图表面,支持墨水、铅笔、马克笔和橡皮擦。PKToolPicker — 工具选择面板。开发人员不需要实现笔触渲染 — PencilKit 使用 Metal 着色器在硬件层面完成。可以设置笔的颜色、粗细和透明度。
import PencilKit
import UIKit
class DrawingViewController: UIViewController {
private lazy var canvasView: PKCanvasView = {
let canvas = PKCanvasView()
canvas.tool = PKInkingTool(.pen, color: .black, width: 5)
canvas.delegate = self
canvas.drawingPolicy = .anyInput
canvas.backgroundColor = .white
return canvas
}()
private lazy var toolPicker: PKToolPicker = {
let picker = PKToolPicker()
picker.addObserver(canvasView)
picker.setVisible(true, forFirstResponder: canvasView)
return picker
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(canvasView)
canvasView.frame = view.bounds
canvasView.becomeFirstResponder()
toolPicker.addObserver(canvasView)
}
// 将绘图保存到 PKDrawing(二进制格式)
func saveDrawing() {
let drawingData = canvasView.drawing.dataRepresentation()
let url = FileManager.default.urls(
for: .documentDirectory, in: .userDomainMask
)[0].appendingPathComponent("drawing.drawing")
try? drawingData.write(to: url)
}
}
extension DrawingViewController: PKCanvasViewDelegate {
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
print("Canvas changed: \(canvasView.drawing.strokes.count) strokes")
}
}PKCanvasView 使用 drawingPolicy .anyInput 接受 Apple Pencil 和手指。PKToolPicker 允许用户选择工具,而无需编写自己的 UI。PKDrawing 以二进制格式存储,具有高压缩率 — 一小时的绘图大约占用 5–10 MB。
Scribble(iPadOS 14+)允许在任何 UITextField 和 UITextView 中进行手写输入。系统使用 Neural Engine 在设备上识别手写。ML 模型适用于拉丁字母和西里尔字母。在 iOS 17+ 中,Scribble 支持自动更正和下一个词预测。开发人员不需要添加代码 — 只要有输入字段,Scribble 就会自动工作。
从 iPadOS 17.4 和 Apple Pencil Pro 开始,开发人员在笔接近屏幕时(最多 12 毫米)接收 悬停事件。事件包含位置、压力和方位角。应用:绘图应用中画笔触点的预览、工具预览、触摸前的视觉反馈。
自适应界面 — iPad 应用的强制性要求。iPad 在不同的屏幕尺寸(8.3 英寸–13 英寸)和多任务模式下运行。UIKit 提供 Size Classes(horizontal: .regular/.compact, vertical: .regular/.compact)和 UISplitViewController 用于自动适配。
Size Classes — 确定可用空间的抽象概念。在全屏模式下,iPad 的两个轴都是 .regular。在 Split View(50%)中,水平类在 iPad mini 或 iPad Air 上可能变为 .compact。所有基于 Auto Layout 和 UICollectionViewCompositionalLayout 构建的流行布局都会自动适配。自定义适配通过重写 traitCollectionDidChange 完成。
import SwiftUI
/// 使用 Size Classes 为 iPad 进行自适应布局
struct AdaptiveContentView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@Environment(\.verticalSizeClass) private var verticalSizeClass
var body: some View {
if horizontalSizeClass == .regular && verticalSizeClass == .regular {
// 平板模式:sidebar + content
NavigationSplitView {
SidebarView()
} detail: {
ContentGridView()
}
} else {
// 紧凑模式:堆栈导航
NavigationStack {
ContentGridView()
}
}
}
}
/// 自适应网格示例:iPad 上 3 列,iPhone 上 2 列
struct ContentGridView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
private var columns: [GridItem] {
let count = horizontalSizeClass == .regular ? 3 : 2
return Array(repeating: GridItem(.flexible(), spacing: 16), count: count)
}
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 16) {
ForEach(items) { item in
ItemCard(item: item)
}
}
.padding()
}
}
}在示例中,NavigationSplitView 仅在 horizontalSizeClass == .regular 时使用(iPad 全屏)。NavigationStack 在紧凑模式下应用。网格列数(3 vs 2)也根据 Size Classes 而变化。所有内容在多任务模式更改时自动更新。
UIKit 提供三种样式的 UISplitViewController:.doubleColumn(sidebar + detail)、.tripleColumn(sidebar + primary + detail)和 .single。在 iPadOS 16+ 中,splitViewController 在 size class 更改时自动在样式之间切换。开发人员为每列设置 viewControllers,UIKit 管理可见性。
iPadOS SDK 包含所有 iOS 框架,以及仅在 iPad 上可用的 API。以下是关键的 iPad 特定功能。
iPadOS 支持应用之间和应用内部的拖放。UIDragInteraction 和 UIDropInteraction 允许拖放文本、图像、文件和自定义对象。Drag & Drop 与 Multi-Touch 同时工作:用户可以使用不同的手指拖放多个元素。在 SwiftUI 中使用 .onDrag 和 .onDrop 修饰符。
连接键盘(Magic Keyboard、Smart Keyboard)时,UIKeyCommand 允许添加快捷键。在 iPadOS 17+ 中,长按 Cmd 会显示键盘快捷键。苹果建议支持标准组合:⌘C(复制)、⌘V(粘贴)、⌘F(搜索)、⌘N(新建文档)。
iPadOS 17+ 支持具有原生分辨率高达 6K(Pro Display XDR)的外接显示器。应用可以通过 UIWindowScene 使用单独的会话 ID 在外接显示器上显示内容。Stage Manager 允许在外接显示器上放置最多 4 个可调整大小的窗口。
| API | 用途 | 在 iOS 中可用 |
|---|---|---|
| UISplitViewController | 多列导航 | 是 |
| PencilKit | Apple Pencil 绘图 | 否 |
| UIDragInteraction | Drag & Drop | 是(仅在应用内) |
| UIKeyCommand | 键盘快捷键 | 是(仅限外接键盘) |
| UIScene | 多窗口模式 | 是(仅限 iPad) |
| UIPencilInteraction | Apple Pencil 双击 | 否 |
| PDFKit | PDF 查看和注释 | 是 |
iPadOS 开发需要特殊的 UI/UX、性能和测试方法。在 iPhone 上可原谅的错误在 iPad 上由于更大的屏幕和多任务处理而变得关键。
iPad 使用 M 系列芯片(M1、M2、M4),统一内存高达 16 GB。尽管硬件强大,但在 Split View 或 Slide Over 中的应用会与另一个应用共享资源。内存压力高于 iPhone。使用图像压缩、集合的懒加载和通过 Instruments Allocations 进行性能分析。具有 16 GB 内存的 iPad Pro M4 可以运行桌面级应用(Final Cut Pro、Logic Pro)。
大多数 iPad 用户使用外接键盘。界面必须完全可以通过键盘控制:Tab 用于在字段之间导航,Space 用于激活所选元素,Enter 用于确认。添加对 Full Keyboard Access 的支持 — 允许从键盘控制任何 UI 元素的系统设置。
iPad 模拟器不能完全再现多任务行为。在真实设备上以不同模式测试:带有繁重应用的 Split View(20 个标签页的 Safari)、带有 4 个窗口的 Stage Manager、快速切换应用的 Slide Over。检查场景:用户从 Slide Over 打开应用,将其拖到 Split View,更改大小,关闭 — 应用不应崩溃。
// 检查 iPadOS 上当前的多任务处理模式
- (void)checkMultitaskingMode:(UIWindowScene *)scene {
if (scene.traitCollection.userInterfaceIdiom != UIUserInterfaceIdiomPad) {
return;
}
BOOL isFullScreen = (scene.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular &&
scene.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular);
BOOL isSlideOver = (CGRectGetWidth(scene.coordinateSpace.bounds) == 320.0);
if (scene.windows.first?.windowScene?.activationConditions.canBecomeFocused == YES) {
NSLog(@"Stage Manager 活跃");
}
if (isSlideOver) {
NSLog(@"Slide Over 模式");
} else if (isFullScreen) {
NSLog(@"全屏模式");
} else {
NSLog(@"Split View 模式");
}
}常见问题
iPadOS 具有扩展的多任务处理(Split View、Slide Over、Stage Manager)、带悬停检测的 Apple Pencil 支持、带下载管理器的桌面版 Safari、原生分辨率的外接显示器以及通过 USB-C 访问外部驱动器的 Files 文件系统。
如果应用使用 UISplitViewController,则自动支持 Split View。应用必须正确处理 size class 更改:在切换到紧凑模式时,使用 UINavigationController 进行屏幕堆栈。要明确拒绝 Split View,请在 Info.plist 中设置 UIRequiresFullScreen = YES。
使用 PencilKit:PKCanvasView 用于绘图表面,PKToolPicker 用于工具选择。对于自定义笔触处理 — 使用 .hover 类型的 UIEvent 和用于双击的 UIPencilInteraction。Apple Pencil Pro 延迟 — 9 毫秒,前一代 — 20 毫秒。
iPad mini 8.3 英寸(2266×1488)、iPad Air 10.9 英寸(2360×1640)、iPad Pro 11 英寸(2388×1668)、iPad Pro 13 英寸 M4(2752×2064)。使用 Size Classes 和 Auto Layout 进行适配。通过 Thunderbolt 支持高达 6K 的外接显示器。Stage Manager 支持最多 8 个窗口(4 个在 iPad 上 + 4 个在外接显示器上)。
iPadOS 17+ 通过 USB-C/Thunderbolt 支持原生分辨率高达 6K 的外接显示器。应用可以通过单独的 UIWindowScene 在外接显示器上显示内容,并具有自己的生命周期。Stage Manager 在外接显示器上支持最多 4 个窗口。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。