/ / Wykryj ruch paska menu pełnoekranowego - cel-c, makra, pasek stanu

Wykryj ruch paska menu pełnoekranowego - cel-c, macos, pasek stanu

Więc teraz mam NSWindow, który rysuje się jak NSToolbar za pomocą INAppStoreWindow, i zastanawiałem się, czy było coś takiegozdarzenie lub wiadomość wysłana, gdy pasek menu przesunie się, gdy aplikacja jest na pełnym ekranie, aby móc w odpowiedzi przesunąć pasek tytułu okna (tak jak działa standardowy pasek NSToolbar). Najwyraźniej NSToolbar wie o czymś, czego ja nie mam, a to uratowałoby mnie przed zrobieniem NSTrackingArea w górnej części mojego okna.

Oto, co robi teraz:

Przed

A oto, co chcę zrobić:

wprowadź opis obrazu tutaj

Niestety, KVO "ing a fullScreenAccessoryView nie działa tak dobrze. Zdarzenia frame są generowane tylko przy wchodzeniu i wychodzeniu z trybu pełnoekranowego, a nie wtedy, gdy pasek narzędzi jest "przesunięty w dół".

Odpowiedzi:

2 dla odpowiedzi № 1

Co powiesz na to? Stwórz NSStatusBarItem z niestandardowym NSView o szerokości 0 a następnie śledzić jego window"Pozycja za pomocą NSWindowWillMoveNotification.

AKTUALIZACJA: Zrobiłem widelec INAppStoreWindow z niestandardowym paskiem narzędzi dołączonym do paska menu. Sprawdź to.


0 dla odpowiedzi nr 2

Jedną z rzeczy, które można wypróbować, jest skorzystanie z ustawienia fałszywego (tzn. Pustego) paska narzędzi w oknie, a następnie podanie go fullScreenAccessoryView. Ten widok jest po przejściu do trybu pełnoekranowego usunięty z hierarchii widoków i umieszczony poniżej paska narzędzi. Dunno jednak, jak to działa, gdy używasz niestandardowej klasy okna ...: /


0 dla odpowiedzi № 3

Szukałem dokładnie tego samego. Udało mi się to zrobić, ustawiając widok podglądu paska tytułowego w WAYAppStoreWindow (lub INAppStoreWindow), aby wysyłać powiadomienia o zmianie ramek, a następnie obserwować powiadomienia o zmianie ramki w tym widoku. Dodaj następujący obserwator do swojej konfiguracji:

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

Włączanie i wyłączanie powiadomień o zmianie ramek podczas wchodzenia / wychodzenia z trybu pełnoekranowego:

window.titleBarView.superview.postsFrameChangedNotifications = YES;

Następnie w realizacji windowTitleBarFrameWillChange: metoda, sprawdź, kiedy pasek tytułu pokaże, porównując z ostatnią pozycją y jego ramki widoku. Oto kod:

// 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: Używam widelca WAYWindow która dodaje obsługę pionowego wycentrowania tytułu dokumentu na pasku tytułowym.