我有一个可变长度NSStatusItem
,我希望尽可能保持可见,即使这意味着只显示一些内容,但是当我的项目足够宽以进入应用程序的菜单栏时,它将完全隐藏。有什么方法可以告诉我什么时候发生这种情况,以便缩小视图以适应可用空间?NSStatusItem是否可以缩小以适合?
我已经试验了自定义视图,覆盖了所有的viewWill*
方法,框架设置器和显示方法,并定期检查包含窗口是否已移动或隐藏。我无法找到任何方式告诉我什么时候我的物品太长。
我有一个可变长度NSStatusItem
,我希望尽可能保持可见,即使这意味着只显示一些内容,但是当我的项目足够宽以进入应用程序的菜单栏时,它将完全隐藏。有什么方法可以告诉我什么时候发生这种情况,以便缩小视图以适应可用空间?NSStatusItem是否可以缩小以适合?
我已经试验了自定义视图,覆盖了所有的viewWill*
方法,框架设置器和显示方法,并定期检查包含窗口是否已移动或隐藏。我无法找到任何方式告诉我什么时候我的物品太长。
这里的基础上,讨论一个完整的工作的例子,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];
}
如果有帮助,我从来没有见过这样做的应用程序。 – 2011-11-15 13:37:11