繁体   English   中英

如何以编程方式在 Swift 5 中的特定屏幕(即主显示器而不是外部显示器)上显示 window? [苹果系统; Xcode 15]

[英]How can I programmatically display a window on a specific screen (i.e., main display as opposed to external displays) in Swift 5? [MacOS; Xcode 15]

我在特定屏幕上展示我的应用程序 window 时遇到了困难(即主显示器而不是我的外部显示器)。 我想在主显示器上显示我的应用程序的原因是我想稍后通过使用CGDisplayCapture(CGDirectDisplayID(2))来清空我的外部显示器。

我发现了如下几个建议和实现。

Swift 3/macOS:在特定屏幕上打开 window

如何更改出现 NSWindow 的 NSScreen

在 os x 的多个显示器上显示 window

如何将 NSWindow 移动到特定屏幕?

但是,我无法弄清楚如何在Swift 5中实现这一点。 这可能是因为以前的帖子已经过时了。 例如,以下我的代码(基于Swift 3/macOS: Open window on certain screen )不起作用......它没有做任何事情。

override func viewDidLoad() {
    super.viewDidLoad()
    
    //set up the main display as the display where window shows up
    let screens = NSScreen.screens
    var pos = NSPoint()
    pos.x = screens[0].visibleFrame.midX
    pos.y = screens[0].visibleFrame.midY
    self.view.window?.setFrameOrigin(pos)

如果我能听到如何实现这一点,我将不胜感激。

ViewController不是执行此操作的正确位置。 使用WindowController并将相关代码放在windowDidLoad中,或者,如果您真的想要一个导致其父 window 填充主显示的视图,请在您的视图上覆盖viewDidMoveToWindow (在大多数情况下,后者在 IMO 中会有点奇怪。)

感谢@Willeke 提出的问题,我能够使用以下代码在主屏幕上显示 window(而不是外部显示器)。 我只需要使用DispatchQueue.main.async {}

   override func viewDidLoad() {
         super.viewDidLoad()
         DispatchQueue.main.async {
             
             //set up the main display as the display where window shows up
             let screens = NSScreen.screens
             var pos = NSPoint()
             pos.x = screens[0].visibleFrame.midX
             pos.y = screens[0].visibleFrame.midY
             self.view.window?.setFrameOrigin(pos)
             
         }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM