在以我的应用程序为中心的同一显示器上显示取景器 window

Displaying a finder window on the same display centered on my app

我的应用程序上有一个按钮,单击后会启动特定路径的查找器 window。

我正在使用这个

NSString *picturesPath = [self getAppPicturesPath];

[[NSWorkspace sharedWorkspace] selectFile:nil inFileViewerRootedAtPath:picturesPath];

问题是,如果我是 运行 应用程序,比方说,显示 1,window 将在显示 2 的随机位置启动。

如何让 window 在与我的应用 运行 相同的显示器上启动,最好在它上面居中?

如果您的应用未被沙盒化,您可以通过使用 AppleScript 设置 window 的位置来实现。你需要检查你想要的屏幕的框架,你可以使用 NSScreen 来完成。例如,如果我 运行 此代码(Swift,用于更好的 NSRect 日志记录,但 Objective-C 中的等价物足够明显)在我当前的设置中:

import Cocoa

for eachScreen in NSScreen.screens {
    print(eachScreen.frame)
}

我得到:

(0.0, 0.0, 1920.0, 1200.0)
(-1440.0, -511.0, 1440.0, 900.0)

如您所见,我的第二个屏幕的框架有负坐标,所以如果我将 window 移动到那边的某处,如下所示:

tell application "Finder"
    set theFolder to folder POSIX file "/usr/bin"
    open theFolder
    set the position of the window of theFolder to {-885, 938}
end tell

它最终出现在第二个屏幕上。

如果您想知道如何实际执行脚本,那里有几个选项。可以用NSAppleScript的烂API,可以用Scripting Bridge的烂API,也可以自己DIYAPI,用NSTask/Process 将脚本发送到 osascript -e.