【问题标题】:How to open new window on second screen (second display)如何在第二个屏幕上打开新窗口(第二个显示)
【发布时间】:2021-10-11 21:53:48
【问题描述】:

任务很简单,但我不知道从哪里开始寻找有关两台显示器的 MacOs 应用程序开发的任何指针。我正在构建一个演示者应用程序,主应用程序将显示在主显示器上,按下按钮我需要将全屏窗口推送到第二台显示器或第二台显示器上。我该怎么做呢?我正在使用 SwiftUI,但我愿意接受其他建议。

【问题讨论】:

标签: macos swiftui appkit


【解决方案1】:

经过一番修改后,我发现了这个解决方案,我对其进行了修改以使其适合我。添加以下扩展。

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 上测试。

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多