【问题标题】:Listen for window resize event in Swift / Objective-C在 Swift / Objective-C 中监听窗口调整大小事件
【发布时间】:2016-03-14 04:02:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c swift macos cocoa accessibility


    【解决方案1】:

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

    可以这样做,更好的方法是让您的自定义窗口管理器类实现NSWindowDelegate 协议并将所有窗口的delegate 设置为您的自定义窗口管理器。这将为您提供所需的所有调整大小和移动信息。

    我是 Haskell,不是 Swift 开发人员,所以我会非常感谢任何代码 sn-p / 展示如何实现此效果的示例。

    实现协议方法:

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

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

    您必须能够识别哪个窗口正在调用委托方法,并跟踪由于对初始窗口更改做出反应而移动或调整大小的任何窗口。请参阅此Stack Overflow question 以获得帮助。

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

    编辑


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

    【讨论】:

    • 我不认为您可以将委托设置为另一个应用程序的窗口......
    • @AminNegm-Awad - 你是什么意思?再说一次,我现在的空闲时间非常有限,所以我会非常缓慢地推动这个项目——我不知道 Objective-C / Swift 或 Cocoa API,所以我在这里问了最基本的问题。你会这么好,详细说明一下吗?
    【解决方案2】:

    第一步,添加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包含文件窗口的delegate属性设置为File's Owner。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

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

        当用户改变窗口大小时,会调用windowWillResize方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-04
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          相关资源
          最近更新 更多