1

NSStatusItem をクリックするとカスタム ウィンドウがポップアップします。コードはMAAttachedwindowに基づいています。すべてがうまく機能していますが、ユーザーが別のステータスバーアイテムや別のアプリなどをクリックしたときにウィンドウを閉じる方法がわかりません。

ウィンドウを作成するための私のコードは次のとおりです。

    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:width] retain];

    //setup custom status menu view
    CGFloat height = [[NSStatusBar systemStatusBar] thickness];
    NSRect viewFrame = NSMakeRect(0.0f, 0.0f, width, height);
    statusMenuView = [[[_ISStatusMenuView alloc] initWithFrame:viewFrame] retain];
    statusMenuView.offset = aOffset;
    statusItem.view = statusMenuView;

    //setup the window to show when clicked
    NSRect contentRect = NSZeroRect;
    contentRect.size = aView.frame.size;
    statusMenuWindow = [[[NSWindow alloc] initWithContentRect:contentRect
                                   styleMask:NSBorderlessWindowMask
                                     backing:NSBackingStoreBuffered 
                                       defer:NO] retain];

    [statusMenuWindow setLevel:NSPopUpMenuWindowLevel];
    [statusMenuWindow setBackgroundColor:[NSColor clearColor]];
    [statusMenuWindow setMovableByWindowBackground:NO];
    [statusMenuWindow setExcludedFromWindowsMenu:YES];
    [statusMenuWindow setOpaque:NO];
    [statusMenuWindow setHasShadow:NO];
    [statusMenuWindow useOptimizedDrawing:YES];
    [[statusMenuWindow contentView] addSubview:aView];
    [statusMenuWindow setDelegate:self];

    statusMenuView.statusMenuWindow = statusMenuWindow;

そして、これが私がウィンドウを表示している方法です:

- (void)centerView{
    NSRect menuFrame = self.window.frame;
    NSRect windowFrame = self.statusMenuWindow.frame;
    NSPoint menuPoint = NSMakePoint(NSMidX(menuFrame), NSMinY(menuFrame));
    menuPoint.x -= windowFrame.size.width*0.5f;
    menuPoint.y -= windowFrame.size.height+self.offset;
    [self.statusMenuWindow setFrameOrigin:menuPoint];
    [self.statusMenuWindow makeKeyAndOrderFront:self];
}

デリゲート メソッドがそのトリックを実行することを望んでwindowDidResignKeyいましたが、この構成ではうまくいきません。実行されているため、デリゲートは機能してwindowDidMoveいます。

- (void)windowDidResignKey:(NSNotification *)notification{
    NSLog(@"windowDidResignKey");
    [statusMenuView hideView];
}

- (void)windowDidResignMain:(NSNotification *)notification{
    NSLog(@"windowDidResignMain");
}

- (void)windowDidMove:(NSNotification *)notification{
    NSLog(@"windowDidMove");
}

要約すると、標準のステータス バー メニューのように、ユーザーが何か他のものをクリックしたときにカスタム ウィンドウを非表示にするにはどうすればよいでしょうか?

編集ポップアップの例 を見た後、唯一欠けていたのは、NSPanel をサブクラス化し、それをキー ウィンドウにできるようにする必要があったことです。

@interface Panel : NSPanel
@end

@implementation Panel

- (BOOL)canBecomeKeyWindow{
    return YES;
}

@end
4

1 に答える 1

4

ウィンドウがキー ウィンドウになることができることを確認し、キーを再署名するときにウィンドウの orderOut: メソッドを呼び出す必要があります。カスタム NSWindowController をまだ使用していない場合は、使用する必要があります。その場合は、その「close」メソッドを呼び出してウィンドウを閉じるだけです。

たくさんのコードを投稿する代わりに、最近投稿されたステータス項目にウィンドウをアタッチする優れた例をご覧になることをお勧めします: Shpakovski Popup Window Example

于 2011-07-22T07:51:38.243 に答える