用途
AppKit Bridge 面向需要将 AppKit 组件与 SwiftUI 结合使用的 macOS 应用开发场景。其核心目标是:在 SwiftUI 为主的应用架构中,仅在必要处桥接 AppKit 能力,从而实现两者的互操作。
主要能力
资料覆盖以下桥接与窗口能力:
- NSViewRepresentable(AppKit → SwiftUI):将 AppKit 视图包装为可在 SwiftUI 中使用的视图。示例使用 NSTextField,通过
makeNSView(context:)创建视图、updateNSView(_:context:)同步状态、makeCoordinator()创建协调器。 - Coordinator 模式:通过
NSObject子类实现委托协议(如 NSTextFieldDelegate),用于处理回调。 - NSHostingView(SwiftUI → AppKit):将 SwiftUI 视图包装为宿主视图,设置
translatesAutoresizingMaskIntoConstraints = false并加入 AppKit 视图层级,使用 Auto Layout 约束贴合父视图四边。 - NSPopover:使用 NSHostingController 承载 SwiftUI 内容,设置
behavior = .transient,通过show(relativeTo:of:preferredEdge:)弹出。 - NSPanel 浮动窗口:示例定义 FloatingPanel 子类,配置非激活面板、标题栏透明、透明背景、浮动层级、跨空间行为等属性,并重写
canBecomeKey/canBecomeMain。 - 显隐动画:通过 NSAnimationContext 修改
alphaValue,在显示与隐藏时分别使用 easeOut 与 easeIn 时间函数。 - 窗口定位:示例提供在当前活动屏幕上居中 NSPanel 的方法,基于
NSScreen.main或首个屏幕的visibleFrame计算原点。
使用方式
资料以代码片段形式给出,使用 Swift 编写,需导入 SwiftUI 与 AppKit。典型流程为:先判断 SwiftUI 是否已提供所需能力;若必须使用 AppKit,则按方向选择桥接方式——AppKit 视图进 SwiftUI 用 NSViewRepresentable,SwiftUI 视图进 AppKit 用 NSHostingView 或 NSHostingController。委托回调需配套 Coordinator;状态更新应走 update 方法而非重新创建视图。
适用场景
- 需要在 SwiftUI 应用中使用 SwiftUI 尚未覆盖的 AppKit 控件。
- 需要浮动窗口(NSPanel)、菜单栏弹出(NSPopover)或自定义窗口外观。
- 需要在既有 AppKit 代码中嵌入 SwiftUI 视图。
约束与限制
资料明确列出若干应避免的做法:不要把 NSViewController 作为应用整体架构;存在 SwiftUI 修饰符时不要用 NSView 子类替代;不要遗漏 makeCoordinator() 导致委托回调失效;不要通过调用 makeNSView 来更新视图,应使用 updateNSView(_:context:)。
决策参考
资料提供的决策树:需要浮动覆盖层用 NSPanel + NSHostingView;需要菜单栏弹出用 NSPopover + NSHostingController;需要自定义窗口装饰用 NSWindow 子类加 titlebarAppearsTransparent;需要在 SwiftUI 中用 AppKit 控件用 NSViewRepresentable;需要在 AppKit 中用 SwiftUI 视图用 NSHostingView 或 NSHostingController;需要毛玻璃效果参考 NSGlassEffectView(另见 liquid-glass 技能)。
暂未提供
资料未说明支持的 macOS 或 Swift 版本、安装方式、依赖、收费或授权信息,也未提供完整可运行工程结构。