我有一個可變長度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