在Swift / Objective-C中监听window resize事件

时间:2015-12-09 01:44:22

标签: objective-c swift macos cocoa accessibility

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

我是Haskell,而不是Swift开发人员,所以对于任何显示如何实现此效果的代码段/示例我都非常重要。 (事实上​​,我将它用作一种Haskell - > Cocoa绑定。)

修改 我也非常有兴趣在Objective-C中找到解决方案,但Swift对我来说更重要。

4 个答案:

答案 0 :(得分:7)

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

可以这样做,更好的方法是让自定义窗口管理器类实现NSWindowDelegate协议,并将所有窗口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
       }
}

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

您必须能够识别哪个窗口正在调用委托方法并跟踪任何窗口移动或调整大小,因为对初始窗口更改做出了反应。有关此问题,请参阅此Stack Overflow question

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

修改

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

答案 1 :(得分:2)

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

Igors-MacBook-Air:wxFork igorkorot$ git remote show origin
* remote origin
  Fetch URL: https://github.com/oneeyeman1/wxwidgets.git
  Push  URL: https://github.com/oneeyeman1/wxwidgets.git
  HEAD branch: master
  Remote branches:
    AUTOCONF_ARCHIVE        tracked
    BAKEFILE                tracked
    BAKEFILE_BRANCH         tracked
    CPPUNIT                 tracked
    EXPAT                   tracked
    GSTREAMER               tracked
    GTK1                    tracked
    GTK2                    tracked
    LIBPNG                  tracked
    NEW_TBAR                tracked
    PKG_CONFIG              tracked
    RXSPENCER               tracked
    SDL                     tracked
    SOC2006_RTL             tracked
    SOC2006_SOCKETS         tracked
    SOC2007_DVC             tracked
    SOC2007_WXWEB           tracked
    SOC2007_XTI             tracked
    SOC2008_WXWALLCTRL      tracked
    SOC2009_AUI             tracked
    SOC2009_FSWATCHER       tracked
    SOC2009_RIBBON          tracked
    SOC2010_GUI_TEST        tracked
    SOC2010_MASKED_CTRL     tracked
    SOC2010_RTC_IMAGES      tracked
    SOC2010_WIN7_UI         tracked
    SOC2011_ANIMATION       tracked
    SOC2011_GTK3            tracked
    SOC2011_WEBVIEW         tracked
    SOC2011_WXIOS           tracked
    SOC2014_QT              tracked
    SOC2014_TASKBAR         tracked
    WXSTANDALONE_EXPERIMENT tracked
    WX_2_0_FIXES            tracked
    WX_2_10_BRANCH          tracked
    WX_2_2_BRANCH           tracked
    WX_2_4_BRANCH           tracked
    WX_2_6_BRANCH           tracked
    WX_2_8_BRANCH           tracked
    WX_2_8_MICROFIX_BRANCH  tracked
    WX_2_9_0_BRANCH         tracked
    WX_3_0_BRANCH           tracked
    ZLIB                    tracked
    arbitrary_weights       tracked
    karsten                 tracked
    master                  tracked
    ownerdraw-refactor      tracked
    show_hidden             tracked
    wxPy-3.0-branch         tracked
    wxPy-3.0.0              tracked
    wxPy_branch             tracked
    wxPy_newswig            tracked
    wxPy_temp_253_branch    tracked
    wxQT                    tracked
    wxSYMBIAN               tracked
    wxUNIVERSAL             tracked
    wxWebKitBranch-2.8      tracked
  Local branches configured for 'git pull':
    arbitrary_weights merges with remote arbitrary_weights
    master            merges with remote master
    show_hidden       merges with remote show_hidden
  Local refs configured for 'git push':
    arbitrary_weights pushes to arbitrary_weights (up to date)
    master            pushes to master            (up to date)
    show_hidden       pushes to show_hidden       (up to date)

Igors-MacBook-Air:wxFork igorkorot$ git remote -v
origin  https://github.com/oneeyeman1/wxwidgets.git (fetch)
origin  https://github.com/oneeyeman1/wxwidgets.git (push)

然后你应该设置delegate属性,将MainWindowController.xib包含文件窗口的委托属性设置为File的所有者。

enter image description here

答案 2 :(得分:1)

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

 {'$unwind':'$issues'} 
 ,{'$match':{'allissues': {$in: p.issues? p.issues.map(Number):[]}}}
 ,{ '$group' :{_id:'$_id', name :{ $first: '$name' },count: { $sum: 1 }} }'

答案 3 :(得分:0)

  1. 创建NSWindowController类
  2. 打开故事板并找到您的窗口控制器,然后将Class设置为自定义类(身份检查选项卡)
  3. 使用windowWillResize方法
  4. 创建NSWindowDelegate类
  5. 将NSWindowDelegate实例设置为NSWindowController实例的window.delegate属性
  6. 当用户更改窗口大小时,将调用windowWillResize方法。