System & Services 进阶 20m
AppKit 的新变化
What's new in AppKit
2023年6月5日
一句话判断
macOS Sonoma 给 AppKit 带来了全新菜单系统、Inspector 面板和大量控件更新,值得每一位 Mac 开发者关注。
这场 Session 讲了什么
macOS Sonoma 中 AppKit 迎来了广泛的更新。NSTableView 和 NSOutlineView 新增了列可见性自定义菜单 API,只需三行代码即可实现。NSProgressIndicator 现在可以直接绑定 Foundation 的 Progress 类型。按钮的 bezel style 引入了新的 automatic 样式,会根据按钮内容和位置自动选择最合适的样式,并成为所有按钮初始化器的默认值。
菜单系统被完全重写为纯 Cocoa 实现,显著减少了内存和 CPU 使用。新菜单系统带来了 Section Headers(分组标题)、Palette Menus(水平排列的调色板菜单)、新的选择行为和 Badge(徽章)等功能。
全新的 Inspector(检查器)分割视图类型让你可以在窗口尾部展示与当前选中内容相关的上下文信息。NSPopover 新增了从工具栏项目锚定弹出和全尺寸内容支持。
值得深挖的点
Palette Menu 是一个令人兴奋的新功能。你可以将菜单项水平排列,非常适合颜色选择器、工具选择等场景。它支持 .selectAny(切换任意项)和 .selectOne(单选)两种选择模式,还提供了创建常用调色板菜单的便捷方法。
菜单徽章功能提供了多种样式:简单的字符串徽章、数字徽章,以及三种专用的计数徽章(新项目、提醒、更新)。AppKit 会自动为这些专用徽章添加合适的文本并进行本地化。
代码片段
// 创建分组标题菜单项
let header = NSMenuItem.sectionHeader(title: "文件操作")
menu.addItem(header)
// 创建调色板菜单
menu.presentationStyle = .palette
for color in colors {
let item = NSMenuItem()
item.image = NSImage(systemSymbolName: "flag.fill", accessibilityDescription: nil)
// 设置 on/off 状态图片
}
menu.selectionMode = .selectOne
// 创建检查器
let inspectorItem = NSSplitViewItem(inspectorWithViewController: inspectorVC)
splitViewController.addSplitViewItem(inspectorItem)
// NSPopover 从工具栏锚定
popover.showRelativeToToolbarItem(toolbarItem)
最佳实践
- 新按钮使用 automatic bezel style,它会根据上下文自动适配
- 利用新的列可见性 API 替代自定义实现
- 使用 Inspector 展示上下文信息,提升 Mac app 的原生感
- Palette Menu 适合工具和颜色选择场景
- 徽章使用专用计数类型以获得自动本地化
还有什么值得关注
- Cooperative App Activation 减少了意外的应用切换
- 图形方面的改进包括新的图片和符号功能
- Swift 和 SwiftUI 的互操作性持续改善
- 文本输入和非英语语言的文本布局得到改进
WWDC 2023