Обнаружение движения в полноэкранном меню

Итак, прямо сейчас у меня есть NSWindow, который рисуется как NSToolbar, используя INAppStoreWindow, и мне было интересно, есть ли какой-либо вид события или сообщения, отправленного, когда панель меню перемещается, когда приложение находится в полноэкранном режиме, чтобы я мог затем переместить строку заголовка окна (как работает стандартный NSToolbar). Очевидно, что NSToolbar знает что-то, чего у меня нет, и это спасло бы меня от создания NSTrackingArea в верхней части моего окна.

Вот что он делает сейчас:

Before

И вот что я хотел бы сделать:

enter image description here

К сожалению, KVO'ing a fullScreenAccessoryView тоже не работает. События кадра генерируются только при входе в полноэкранный режим и выходе из него, а не в том случае, когда панель инструментов "перемещена вниз" в строке состояния.

Ответ 1

Как насчет этого? Создайте NSStatusBarItem с пользовательским NSView с шириной 0, а затем поместите его window с помощью NSWindowWillMoveNotification.

UPDATE: я сделал вилку INAppStoreWindow с помощью специальной панели инструментов, прикрепленной к строке меню. Проверьте это.

Ответ 2

Одна вещь, которую вы могли бы попробовать, - использовать в окне набор поддельной (то есть пустой) панели инструментов, а затем дать ей fullScreenAccessoryView. Это представление при перемещении в полноэкранный режим удаляется из иерархии представлений и прикрепляется под панелью инструментов. Dunno, однако, как это работает при использовании пользовательского класса окна...:/

Ответ 3

Я искал точно то же самое. Я смог сделать это, установив надпись вида заголовка в 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;
}

NB: Im использует вилку WAYWindow, которая добавляет поддержку вертикального центрирования заголовка документа в заголовке.