在 Swift / Objective-C 中侦听 window 调整大小事件

Listen for window resize event in Swift / Objective-C

是否可以遍历 OSX 中任何应用程序的所有打开 windows 并在 Swift 中监听它们的调整大小事件?我想创建自定义 window 管理器,它会根据用户行为移动和调整事件大小 – 因此,如果用户调整 window 的大小,其他 windows 会自动重新安排。

我是 Haskell,不是 Swift 开发人员,所以我将非常感谢任何显示如何实现此效果的代码片段/示例。 (实际上,我会将其用作一种 Haskell -> Cocoa 绑定。)

编辑: 我也很想在 Objective-C 中看到解决方案,但是 Swift 在这里对我来说更重要。

是否可以遍历 OSX 中任何应用程序的所有打开 windows 并在 Swift 中监听它们的调整大小事件?

可以这样做,更好的方法是让您的自定义 window 经理 class 为您的自定义 window 经理实施 NSWindowDelegate protocol and set all window's delegate。这将为您提供所需的所有调整大小和移动信息。

我是 Haskell,不是 Swift 开发人员,所以如果有任何代码片段/示例展示如何实现这一点,我将非常感激效果.

实现协议方法:

class CustomWindowManager: NSWindowController, NSWindowDelegate {

       // Resize Methods

       func windowWillResize(sender: NSWindow,toSize frameSize: NSSize) -> NSSize {

            // Your code goes here
       }

       func windowDidResize(notification: NSNotification) {

           // Your code goes here
       }
}

然后您可以选择要实现的协议方法,因为协议中的所有方法都是可选的。

您将必须能够识别哪个 window 正在调用委托方法并跟踪任何 windows 由于响应而移动或调整大小最初的 window 变化。请参阅此 Stack Overflow question 以获得帮助。

要获取当前屏幕上所有 windows 的列表,请参阅此 Stack Overflow question

编辑


要获取当前在屏幕上的 您的应用程序 的所有 windows 的列表,请参阅此 Stack Overflow question

第一步,你应该添加NSWindowDelegate和函数windowWillResize,完整代码如下:

class MainWindowController: NSWindowController, NSWindowDelegate {

    override var windowNibName: String? {
        return "MainWindowController"
    }

    override func windowDidLoad() {
        super.windowDidLoad()
    }

    func windowDidResize(notification: NSNotification) {
        //listen the event
    }

}

那么你应该设置delegate 属性,设置MainWindowController.xib include file window的delegate 属性 to File's Owner。

  1. 创建一个 NSWindowController Class
  2. 打开故事板并找到 window 控制器,然后将 Class 设置为自定义 Class(身份检查选项卡)
  3. 使用 windowWillResize 方法
  4. 创建一个 NSWindowDelegate Class
  5. 将 NSWindowDelegate 实例设置为 NSWindowController 实例的 window.delegate 属性

当用户改变 window 尺寸时,将调用 windowWillResize 方法。

使用 Swift 3 windowDidResize 方法应如下所示:

func windowDidResize(_ notification: Notification) {
    // Listen to a window resize event

}