任務很簡單,但我不知道從哪里開始尋找有關帶有兩個顯示幕的 MacOs App 開發的任何指示。我正在構建一個演示者應用程式,其中主應用程式將顯示在主顯示幕上,通過按下按鈕,我需要將全屏視窗推送到第二個顯示幕或第二個顯示幕上。我該怎么做呢?我正在使用 SwiftUI,但我愿意接受其他建議。
uj5u.com熱心網友回復:
經過一番修補后,我遇到了這個解決方案,我對其進行了修改以使其對我有用。添加以下擴展名。
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 上測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314061.html
上一篇:將第一方庫與CMake鏈接
