2011-02-13 66 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]; 
}