【发布时间】:2021-10-11 21:53:48
【问题描述】:
任务很简单,但我不知道从哪里开始寻找有关两台显示器的 MacOs 应用程序开发的任何指针。我正在构建一个演示者应用程序,主应用程序将显示在主显示器上,按下按钮我需要将全屏窗口推送到第二台显示器或第二台显示器上。我该怎么做呢?我正在使用 SwiftUI,但我愿意接受其他建议。
【问题讨论】:
-
好的,谢谢!这与我的研究相结合解决了我的问题。我用解决方案更新了我的帖子。谢谢!
任务很简单,但我不知道从哪里开始寻找有关两台显示器的 MacOs 应用程序开发的任何指针。我正在构建一个演示者应用程序,主应用程序将显示在主显示器上,按下按钮我需要将全屏窗口推送到第二台显示器或第二台显示器上。我该怎么做呢?我正在使用 SwiftUI,但我愿意接受其他建议。
【问题讨论】:
经过一番修改后,我发现了这个解决方案,我对其进行了修改以使其适合我。添加以下扩展。
extension View {
private func newWindowInternal(with title: String) -> NSWindow {
let window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 0, height: 0),
styleMask: [.closable, .borderless],
backing: .buffered,
defer: false)
guard let secondScreen = NSScreen.screens.last else {
print("Failed to find last display")
return window
}
window.setFrame(secondScreen.frame, display: true)
window.level = NSWindow.Level.screenSaver
window.isReleasedWhenClosed = false
window.title = title
window.orderFront(nil)
return window
}
func openNewWindow(with title: String = "new Window") {
self.newWindowInternal(with: title).contentView = NSHostingView(rootView: self)
}
}
在您的 ContentView 中,添加一个按钮,该按钮将触发新窗口的激活。这是一个例子ContentView
struct ContentView: View {
@State private var windowOpened = false
var body: some View {
VStack {
Button("Open window") {
if !windowOpened {
ProjectorView(isOpen: $windowOpened).openNewWindow(with: "Projector")
}
}
.keyboardShortcut("o", modifiers: [.option, .command])
Button("Close window") {
NSApplication.shared.windows.first(where: { $0.title == "Projector" })?.close()
}
.keyboardShortcut("w", modifiers: [.option, .command])
}
.frame(width: 300, height: 100)
}
}
最后,这是ProjectorView 的样子。
struct ProjectorView: View {
@Binding var isOpen: Bool
var body: some View {
HStack {
Spacer()
VStack {
Spacer()
Text("Hello World!")
.font(.title2)
Spacer()
}
Spacer()
}
.padding()
.onDisappear {
isOpen = false
}
.onAppear {
isOpen = true
}
}
}
此解决方案效果很好。按 ⌥⌘O 将在所有其他窗口上方的第二个屏幕上打开 ProjectorView,然后按 ⌥⌘W 将关闭ProjectorView 窗口。可以在扩展中调整窗口设置和窗口级别。
在 macOS Monterey、Xcode 13、Apple M1 MacBook Air 上测试。
【讨论】: