2011-02-13 101 views
18

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

我已经试验了自定义视图,覆盖了所有的viewWill*方法,框架设置器和显示方法,并定期检查包含窗口是否已移动或隐藏。我无法找到任何方式告诉我什么时候我的物品太长。

+1

如果有帮助,我从来没有见过这样做的应用程序。 – 2011-11-15 13:37:11

回答

1

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

因此,我会建议您改变默认情况下的状态项,并在用户点击时展开。

编辑: 其实看看讨论here:一个非常聪明的方法来检测,如果你的状态项被隐藏。所以一旦你发现它被隐藏起来,你可以缩小它,使它重新出现。

+0

这是一个普遍的合理建议,这个问题已经打开了很久,我怀疑肯定会有答案。 :) – alltom 2011-11-29 20:17:31

1

这里的基础上,讨论一个完整的工作的例子,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 - 这是一个比较复杂一点,但我认为这更可能是通过苹果的静态分析在Mac App Store的私有方法的用法:

设置靶和NSStatusItem的动作来自己控制的方法,例如:

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

然后,在被调用的方法访问该窗口:

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