mis*_*ake 4 nsdocument appkit nswindowcontroller
我有一个基于文档的应用程序。我重写NSDocument'smakeWindowControllers以实例化自定义窗口控制器。它的初始化程序调用init(window: NSWindow?)其超类,即它不使用任何涉及 nib 文件的初始化程序。
如何进行级联工作(请参阅shouldCascadeWindows)?目前,每个窗口都在第一个屏幕上的相同位置打开。
我可以通过调用某些东西来重用现有的级联逻辑吗NSWindowController?
如果我必须自己手动实现,我应该如何最好地获取最顶层文档窗口的位置?文档的潜在多个窗口中的哪一个应该是计算偏移量的窗口?
func cascadeTopLeft(from topLeftPoint: NSPoint) -> NSPoint
将窗口的左上角定位到给定点。
参数
topLeftPoint 窗口的新左上角(在屏幕坐标中)。当 NSZeroPoint 时,窗口不会移动,除非需要约束到可见屏幕
NSZeroPoint是第一个窗口的起点。
返回值 在屏幕坐标中从窗口左上角移动的点。
讨论
返回的点可以传递给后续的cascadeTopLeft(from:)调用来定位下一个窗口,以便两个窗口的标题栏完全可见。
返回的点是下一个窗口的起点。
示例(如文本编辑):
static var cascadingPoint = NSZeroPoint
override func makeWindowControllers() {
let window = NSWindow(contentRect: NSMakeRect(100, 100, 500, 500), styleMask: .titled, backing: .buffered, defer: true)
Document.cascadingPoint = window.cascadeTopLeft(from: Document.cascadingPoint)
let windowController = NSWindowController(window: window)
addWindowController(windowController)
}
Run Code Online (Sandbox Code Playgroud)
另一个例子(比如 Safari)
override func makeWindowControllers() {
let window = NSWindow(contentRect: NSMakeRect(100, 100, 500, 500), styleMask: .titled, backing: .buffered, defer: true)
let cascadingPoint = NSApp.mainWindow?.cascadeTopLeft(from: NSZeroPoint) ?? NSZeroPoint
window.cascadeTopLeft(from: cascadingPoint)
let windowController = NSWindowController(window: window)
addWindowController(windowController)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |