繁体   English   中英

NSStatusItem可以缩小以适应吗?

[英]Can an NSStatusItem be shrunk to fit?

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

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

这是一个完整的工作示例,基于空洞7引用的讨论:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM