【问题标题】:Cascading in custom NSWindowController自定义 NSWindowController 中的级联
【发布时间】:2019-08-18 17:22:01
【问题描述】:

我有一个基于文档的应用程序。我覆盖NSDocumentmakeWindowControllers 来实例化自定义窗口控制器。它的初始化程序调用其超类的init(window: NSWindow?),即它不使用任何涉及 nib 文件的初始化程序。

如何使级联工作(请参阅shouldCascadeWindows)?目前每个窗口都在第一个屏幕上的相同位置打开。

我可以通过在NSWindowController 上调用某些东西以某种方式重用现有的级联逻辑吗?

如果我必须自己手动实现它,我应该如何最好地获得最顶部文档窗口的位置?文档中可能有多个窗口中的哪个窗口应该是计算偏移量的窗口?

【问题讨论】:

  • 窗口是如何实例化的?第一个窗口的位置是什么?哪个窗口是文档的主窗口?你想从哪个窗口级联?窗口的框架是否自动保存?您是否搜索了级联方法?
  • 我想要默认行为,即当您在 Xcode 中创建新的基于文档的应用程序时会得到什么。如果没有默认或推荐位置,我可以为第一个窗口选择一个位置。现在第一个窗口控制器的窗口是主窗口。我想从最顶层的文档窗口级联,无论是默认还是推荐的做法。不确定自动保存的相关性,毕竟这是一个新文档,没有以前的记录。我知道cascadeTopLeft,但这只是抵消数学。我没有找到其他任何东西。
  • 带有“窗口的框架是否自动保存?”我的意思是frameAutosaveName
  • 此时为空字符串。
  • 窗口控制器在从 nib 加载窗口后调用cascadeTopLeft(from:)。如果您提供窗口,您必须致电cascadeTopLeft(from:)

标签: appkit nsdocument nswindowcontroller


【解决方案1】:

func cascadeTopLeft(from topLeftPoint: NSPoint) -> NSPoint

将窗口的左上角定位到给定点。

参数

左上角 窗口的新左上角,在屏幕坐标中。 NSZeroPoint 时,窗口不移动,除非需要约束到可见屏幕

NSZeroPoint 是第一个窗口的起点。

返回值 在屏幕坐标中从窗口左上角移动的点。

讨论

可以将返回的点传递给后续调用 cascadeTopLeft(from:) 以定位下一个窗口,以便两个窗口的标题栏完全可见。

返回的点是下一个窗口的起点。

示例(如 TextEdit):

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)
}

另一个例子(如 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2017-03-29
    • 2020-10-16
    • 2016-05-24
    • 2017-07-31
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多