簡體   English   中英

NSStatusItem可以縮小以適應嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM