11

だから今、私は INAppStoreWindow を使用して NSToolbar のように自分自身を描画する NSWindow を持っています。アプリが全画面表示になっているときにメニューバーが移動したときに、何らかのイベントやメッセージが送信されたのではないかと思っていました。応答するウィンドウのタイトル バー (標準の NSToolbar の動作方法)。明らかに、NSToolbar は私が知らないことを知っているので、ウィンドウの上部に NSTrackingArea を作成する必要がなくなります。

現在の動作は次のとおりです。

前

そして、これが私がやりたいことです:

ここに画像の説明を入力

残念ながら、KVO'ingfullScreenAccessoryViewも同様に機能しません。フレーム イベントは、フルスクリーン モードの開始時と終了時にのみ生成され、ステータス バーによってツールバーが「下に移動」されたときは生成されません。

4

3 に答える 3

2

これはどう?幅NSStatusBarItemのあるカスタムで作成し、を使用してその位置を追跡します。NSView0windowNSWindowWillMoveNotification

更新:メニューバーにカスタム ツールバーが接続されたINAppStoreWindowのフォークを作成しました。それをチェックしてください

于 2012-10-12T20:45:32.277 に答える
0

あなたが試すことができる1つのことは、ウィンドウに偽の(つまり空の)ツールバーを設定してから、fullScreenAccessoryView. このビューは、フルスクリーンに移行すると、ビュー階層から削除され、ツールバーの下に追加されます。ただし、カスタムウィンドウクラスを使用する場合にこれがどのように機能するかはわかりません... :/

于 2012-08-27T18:39:56.607 に答える
0

私はまったく同じことを達成しようとしていました。WAYAppStoreWindow (または INAppStoreWindow)でタイトルバー ビューのスーパービューを設定してフレーム変更通知を投稿し、このビューでフレーム変更通知を観察することで、これを行うことができました。セットアップに次のオブザーバーを追加します。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(windowTitleBarFrameDidChange:)
                                             name:NSViewFrameDidChangeNotification
                                           object:window.titleBarView.superview];

フルスクリーンに入るとき/フルスクリーンから出るときのフレーム変更通知をオン/オフにします。

window.titleBarView.superview.postsFrameChangedNotifications = YES;

次に、メソッドの実装で、windowTitleBarFrameWillChange:スーパービューのフレームの最後の y 位置と比較して、タイトルバーがいつ表示されるかを確認します。コードは次のとおりです。

// Window titlebar heights.
#define kWindowTitlebarHeightDefault    22.0
#define kWindowTitlebarHeightStandard   37.0
#define kWindowTitlebarHeightExtended   82.0

- (void) windowTitleBarFrameDidChange:(NSNotification *)notification;
{
    NSView * titleBarView = [notification object];  // view is actually the titlebar container view

    if (NSMinX(_lastTitleBarFrame) == NSMinX(titleBarView.frame) &&
        NSWidth(_lastTitleBarFrame) == NSWidth(titleBarView.frame) &&
        NSHeight(_lastTitleBarFrame) == NSHeight(titleBarView.frame) &&
        NSMinY(_lastTitleBarFrame) == -kWindowTitlebarHeightDefault &&
        NSMinY(titleBarView.frame) > -kWindowTitlebarHeightDefault)                     // titlebar will show
    {
        [self windowTitleBarWillShow];
    }
    else if (NSMinX(_lastTitleBarFrame) == NSMinX(titleBarView.frame) &&
             NSWidth(_lastTitleBarFrame) == NSWidth(titleBarView.frame) &&
             NSHeight(_lastTitleBarFrame) == NSHeight(titleBarView.frame) &&
             NSMinY(_lastTitleBarFrame) == 0.0 && NSMinY(titleBarView.frame) < 0.0)     // titlebar will hide
    {
        [self windowTitleBarWillHide:YES];
    }
    else if (NSWidth(_lastTitleBarFrame) != NSWidth([NSScreen mainScreen].frame) &&
             NSWidth(titleBarView.frame) == NSWidth([NSScreen mainScreen].frame))       // just went full-screen
    {
        [self windowTitleBarWillHide:NO];
    }

    _lastTitleBarFrame = titleBarView.frame;
}

- (void) windowTitleBarWillHide:(BOOL)animate
{
    WAYAppStoreWindow * window = (WAYAppStoreWindow *)[(NSWindowController *)[[self windowControllers] objectAtIndex:0] window];
    NSView * themeFrame = window.titleBarView.superview.superview;    
    if (animate)
        [themeFrame animator].alphaValue = 0.0;
    else
        themeFrame.alphaValue = 0.0;
}

- (void) windowTitleBarWillShow
{
    WAYAppStoreWindow * window = (WAYAppStoreWindow *)[(NSWindowController *)[[self windowControllers] objectAtIndex:0] window];
    NSView * themeFrame = window.titleBarView.superview.superview;
    [themeFrame animator].alphaValue = 1.0;
}

- (void) windowWillEnterFullScreen:(NSNotification *)notification
{
    WAYAppStoreWindow * window = [notification object];
    [self setUpFullScreenTitleBarForWindow:window];
    _lastTitleBarFrame = NSZeroRect;
}

- (void) windowDidEnterFullScreen:(NSNotification *)notification;
{
    WAYAppStoreWindow * window = [notification object];
    window.titleBarView.superview.postsFrameChangedNotifications = YES;
    _fullscreenToolbarView.hidden = NO;
}

- (void) windowWillExitFullScreen:(NSNotification *)notification;
{
    WAYAppStoreWindow * window = [notification object];
    window.titleBarView.superview.postsFrameChangedNotifications = NO;
    [self setUpStandardTitleBarForWindow:window];
}

- (void) setUpNormalTitleBarForWindow:(WAYAppStoreWindow *)window
{
    window.appearance = nil;
    window.showsTitle = NO;
    window.titleBarHeight = kWindowTitlebarHeightExtended;
    window.verticalTrafficLightButtons = YES;
    window.centerTrafficLightButtons = YES;
    window.trafficLightButtonsLeftMargin = 13.0;

    _fullscreenToolbarView.hidden = YES;
}

- (void) setUpFullScreenTitleBarForWindow:(WAYAppStoreWindow *)window
{
    window.appearance = [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark];
    window.showsTitle = YES;
    window.titleBarHeight = kWindowTitlebarHeightStandard;
    window.verticalTrafficLightButtons = NO;
    window.centerTrafficLightButtons = YES;
    window.trafficLightButtonsLeftMargin = 13.0;
    window.verticallyCenterTitle = YES;

    _fullscreenToolbarView.hidden = YES;
    _lastTitleBarFrame = NSZeroRect;
}

注意: 私はWAYWindowのフォークを使用しています。これは、ドキュメント タイトルをタイトルバーの垂直方向の中央に配置するためのサポートを追加します。

于 2015-07-21T23:22:05.703 に答える