【问题标题】:Can an NSStatusItem be shrunk to fit?可以缩小 NSStatusItem 以适应吗?
【发布时间】:2011-02-13 21:34:48
【问题描述】:

我有一个可变长度NSStatusItem,我希望尽可能保持可见,即使这意味着只显示部分内容,但是当我的项目足够宽以运行到应用程序的菜单栏时,它是完全隐藏。有没有办法知道何时发生这种情况,以便我可以缩小视图以适应可用空间?

我尝试了一个自定义视图,覆盖所有viewWill* 方法、框架设置器和显示方法,并定期检查包含的窗口是否已移动或隐藏。我找不到任何方法来判断我的物品何时过长。

【问题讨论】:

  • 如果有帮助的话,我从来没有见过这样的应用程序。

标签: cocoa macos nsstatusitem


【解决方案1】:

这取决于您的状态项应用程序是否可以检测 OS X 菜单栏中的菜单项数量。快速搜索苹果文档显示,苹果没有为此目的提供公共 API。据我所知,也没有私人的。

因此,我建议您将状态项默认设置为小,并在用户单击时展开。

编辑: 其实看看here的讨论:一个非常聪明的方法来检测你的状态项是否被隐藏。因此,一旦您检测到它被隐藏,您可以将其缩小以使其重新出现。

【讨论】:

  • 一般来说这是一个合理的建议,而且这个问题已经开放了这么久,我怀疑会有一个肯定的答案。 :)
【解决方案2】:

以下是基于hollow7 引用的讨论的完整工作示例:

self.statusItem.title = @"Message that will be truncated as necessary.";
while (self.statusItem.title.length > 0) {
    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenAboveWindow, (CGWindowID)self.statusItemWindow.windowNumber);
    if (CFArrayGetCount(windowList) > 1) {
        CFRelease(windowList);
        self.statusItem.title = [self.statusItem.title substringToIndex:self.statusItem.title.length - 1];
    } else {
        CFRelease(windowList);
        break;
    }
}

剩下的一个棘手的部分是获取 NSStatusItem 窗口。到目前为止,我已经找到了两种获取方法。

1 - 有一个名为 _window 的私有方法。你可以这样使用它:

self.statusItemWindow = [self.statusItem performSelector:@selector(_window)];

2 - 这有点复杂,但我认为这更有可能通过 Apple 对 Mac App Store 中私有方法使用的静态分析:

NSStatusItem 的目标和操作设置为您控制的方法,如下所示:

self.statusItem.target = self;
self.statusItem.action = @selector(itemClicked:);

然后在调用的方法中访问窗口:

- (void)itemClicked:(id)sender {
    self.statusItemWindow = [[NSApp currentEvent] window];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多