如何在第二个屏幕(第二个显示器)上打开新的 window
How to open new window on second screen (second display)
任务很简单,但我不知道从哪里开始寻找具有两个显示器的 MacOs 应用程序开发的任何指针。我正在构建一个演示应用程序,其中主应用程序将显示在主显示器上,按下一个按钮我需要将全屏 window 推到第二个显示器或第二个显示器上。我该怎么做呢?我正在使用 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 中,添加一个将触发激活新 window 的按钮。这是一个例子 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: { [=11=].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
所有其他 windows 并按下 ⌥⌘W 将关闭 ProjectorView
window . Window 设置,window 级别可以在扩展中调整。
在 macOS Monterey、Xcode 13、Apple M1 MacBook Air 上测试。
任务很简单,但我不知道从哪里开始寻找具有两个显示器的 MacOs 应用程序开发的任何指针。我正在构建一个演示应用程序,其中主应用程序将显示在主显示器上,按下一个按钮我需要将全屏 window 推到第二个显示器或第二个显示器上。我该怎么做呢?我正在使用 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 中,添加一个将触发激活新 window 的按钮。这是一个例子 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: { [=11=].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
所有其他 windows 并按下 ⌥⌘W 将关闭 ProjectorView
window . Window 设置,window 级别可以在扩展中调整。
在 macOS Monterey、Xcode 13、Apple M1 MacBook Air 上测试。