[英]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.