Macos 获取NSStatusItem框架更改的通知?

Macos 获取NSStatusItem框架更改的通知?,macos,cocoa,notifications,nsnotificationcenter,nsstatusitem,Macos,Cocoa,Notifications,Nsnotificationcenter,Nsstatusitem,在使用带有如下自定义视图的NSStatusItem的应用程序中: 。。。在以下情况下,您如何获得通知: 由于全屏应用程序,状态栏被隐藏 状态项移动位置是因为添加/删除/调整了另一项的大小 当项目更改位置时,这两种方法都是将自定义视图移动到正确位置所必需的。有一种方法-[NSStatusItem setView:。为状态项设置自定义视图时,此视图将自动插入到特殊的状态栏窗口中。您可以使用方法-[NSView window]访问该窗口,以观察其NSWindowDidMoveNotification

在使用带有如下自定义视图的
NSStatusItem
的应用程序中:

。。。在以下情况下,您如何获得通知:

  • 由于全屏应用程序,状态栏被隐藏
  • 状态项移动位置是因为添加/删除/调整了另一项的大小

  • 当项目更改位置时,这两种方法都是将自定义视图移动到正确位置所必需的。

    有一种方法
    -[NSStatusItem setView:
    。为状态项设置自定义视图时,此视图将自动插入到特殊的状态栏窗口中。您可以使用方法
    -[NSView window]
    访问该窗口,以观察其
    NSWindowDidMoveNotification

    - (void)applicationDidFinishLaunching:(NSNotification *)notification
    {
        NSStatusItem *statusItem = [self newStatusItem];
        NSView *statusItemView = [self newStatusItemView];
        statusItem.view = statusItemView;
    
        NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
        [dnc addObserver:self selector:@selector(statusBarDidMove:)
                    name:NSWindowDidMoveNotification object:statusItemView.window];
    }
    
    - (void)statusBarDidMove:(NSNotification *)note
    {
        NSWindow *window = note.object;
        NSLog(@"%@", NSStringFromRect(window.frame)); // i.e. {{1159, 900}, {24, 22}}
    }
    

    每次状态栏变为可见或隐藏以及图标移动时,您都会收到通知。这是您更新弹出面板位置的机会。

    如果在此处也调用了NSWindowWillMoveNotification,那将很好,但不幸的是,它不是。可能在未来的操作系统版本中。通常,当您激活另一个最前端的应用程序时,状态栏会更改其状态。如果你开发了一个菜单栏助手应用程序,那么当状态栏移动时,弹出面板很可能不可见。如果是这样的话,你可以安全地避免所有的操作。我有一个应用程序,它有一个用例,可以在某些时候显示面板,即使应用程序不是最重要的。这就是我需要它的原因。然后,我建议在
    nswindowdidmoveinnotification
    上执行一个平滑的弹出动画到新位置,感觉应该很棒。谢谢。想试试我的下一期吗?