18

NSStatusItemコンテンツの一部のみを表示することを意味する場合でも、可能な限り表示したい可変長がありますが、アイテムがアプリケーションのメニューバーにぶつかるほど広い場合は、完全に非表示になります。利用可能なスペースに合わせてビューを縮小できるように、これがいつ発生するかを知る方法はありますか?

カスタムビューを試し、すべてのviewWill*メソッド、フレームセッター、および表示メソッドをオーバーライドし、含まれているウィンドウが移動したか非表示になったのかを定期的にチェックしました。アイテムが長すぎるかどうかを判断する方法が見つかりません。

4

2 に答える 2

1

これは、ステータスアイテムアプリケーションがOSXメニューバーのメニューアイテムの数を検出できるかどうかによって異なります。Appleのドキュメントをざっと検索すると、これを行う目的でAppleが提供しているパブリックAPIがないことがわかります。私の知る限り、私的なものもありません。

したがって、代わりに、ステータスアイテムをデフォルトで小さくし、ユーザーがクリックすると拡大することをお勧めします。

編集:実際にここ での議論を見てください:あなたのステータスアイテムが隠されているかどうかを検出するための本当に賢い方法。したがって、非表示になっていることを検出したら、縮小して再表示することができます。

于 2011-11-16T15:13:24.780 に答える
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ウィンドウを取得することです。これまでのところ、それを取得するための2つの方法を見つけました。

1-と呼ばれるプライベートメソッドがあり_windowます。あなたはそれをこのように利用することができます:

self.statusItemWindow = [self.statusItem performSelector:@selector(_window)];

2-これはもう少し複雑ですが、MacAppStoreでのプラ​​イベートメソッドの使用に関するAppleの静的分析に合格する可能性が高いと思います。

次のように、のターゲットとアクションNSStatusItemを制御するメソッドに設定します。

self.statusItem.target = self;
self.statusItem.action = @selector(itemClicked:);

次に、呼び出されたメソッドのウィンドウにアクセスします。

- (void)itemClicked:(id)sender {
    self.statusItemWindow = [[NSApp currentEvent] window];
}
于 2014-01-27T22:24:56.217 に答える