【问题标题】:Get Notification of NSStatusItem frame change?获取 NSStatusItem 帧更改的通知?
【发布时间】:2012-07-16 12:50:38
【问题描述】:

在一个使用 NSStatusItem 的应用中,自定义视图如下:

...您如何在以下情况下收到通知:

  1. 由于全屏应用,状态栏被隐藏
  2. 状态项移动位置是因为添加/删除/调整了另一个项?

当项目改变位置时,两者都是将自定义视图移动到正确位置所必需的。

【问题讨论】:

    标签: macos cocoa notifications nsnotificationcenter nsstatusitem


    【解决方案1】:

    有一个方法-[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 就好了,但不幸的是没有。也许在未来的操作系统版本中。
    • 通常,当您激活另一个最前面的应用程序时,状态栏会更改其状态。如果你开发了一个菜单栏助手应用程序,那么在状态栏移动的那一刻,弹出面板很可能会变得不可见。如果是这种情况,您可以安全地避免所有处理。
    • 我有一个应用程序,它有一个用例来保持面板在特定时间显示,即使应用程序不是最重要的也是如此。这就是为什么我需要这个
    • 那我建议在NSWindowDidMoveNotification的新位置上执行一个流畅的弹出动画,感觉应该很棒。
    • 谢谢。关心我的下一个问题吗? stackoverflow.com/questions/11525426/…
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多