如何在macOS应用开发中实现在第二显示屏打开全屏新窗口
macOS 多显示屏第二屏开全屏窗口实现方案(SwiftUI + AppKit 兼容方案)
以下为可直接落地的实现逻辑,SwiftUI 原生对多屏窗口的控制能力有限,搭配少量 AppKit 桥接代码即可满足需求:
核心逻辑
先获取所有外接屏幕实例,筛选出目标第二屏,再创建独立窗口绑定到对应屏幕,最后设置为全屏显示即可。完整代码示例
import SwiftUI import AppKit // 主界面视图 struct MainDisplayView: View { var body: some View { Button("打开第二屏全屏窗口") { openSecondScreenFullWindow() } .padding() .frame(width: 300, height: 200) } func openSecondScreenFullWindow() { // 校验是否存在第二显示屏 guard NSScreen.screens.count > 1, let targetScreen = NSScreen.screens.first(where: { $0 != NSScreen.main }) else { print("未检测到外接第二显示屏") return } // 第二屏要渲染的自定义内容 let secondScreenContent = SecondScreenView() // 创建匹配第二屏尺寸的无边框窗口 let secondWindow = NSWindow( contentRect: targetScreen.frame, styleMask: [.borderless, .fullSizeContentView], backing: .buffered, defer: false, screen: targetScreen ) // 配置窗口属性 secondWindow.isOpaque = true secondWindow.backgroundColor = .black // 可根据需求调整窗口层级,值越高越不容易被其他应用遮挡 secondWindow.level = .statusBar secondWindow.contentView = NSHostingView(rootView: secondScreenContent) secondWindow.makeKeyAndOrderFront(nil) // 触发全屏显示 secondWindow.toggleFullScreen(nil) } } // 第二屏自定义展示视图,可根据业务需求自行修改 struct SecondScreenView: View { var body: some View { Text("第二屏全屏展示内容") .font(.system(size: 60, weight: .bold)) .foregroundColor(.white) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(.black) } }
- 额外配置说明
- 如需避免全屏时系统自动切换到独立 Space 空间,可在项目
Info.plist中添加键NSFullScreenUsesSeparateSpace,值设置为NO - 如果需要监听屏幕插拔的动态变化,可监听
NSApplication.didChangeScreenParametersNotification通知实时更新可用屏幕列表 - 如需限制第二屏窗口不能被用户手动关闭、拖动,保留
styleMask为.borderless即可,不需要额外添加可交互的窗口控制按钮属性
- 如需避免全屏时系统自动切换到独立 Space 空间,可在项目
内容的提问来源于stack exchange,提问作者Denny L.
相关产品推荐
相关产品推荐

