/ / Detect fullscreen движение на лентата на менюто - цел-c, macos, statusbar

Откриване на цял екран движение на лентата на менюто - цел-c, макроси, лентата на състоянието

Така че сега имам NSWindow, който се привлича като NSToolbar използва INAppStoreWindow, и се чудех дали има някакъв видсъбитие или съобщение, когато лентата с менюта се движи, докато приложението е на цял екран, така че след това мога да преместя заглавната лента на прозореца в отговор (начина, по който работи стандартна NSToolbar). Ясно е, че NSToolbar знае нещо, което не съм, и това ще ме спаси от създаването на NSTrackingArea в горната част на моя прозорец.

Ето какво прави сега:

Преди

И тук е това, което искам да направя:

въведете описанието на изображението тук

За съжаление, KVO "a fullScreenAccessoryView не работи както добре. Рамковите събития се генерират само при въвеждане и излизане от режим на цял екран, а не когато лентата с инструменти е "преместена надолу" от лентата на състоянието.

Отговори:

2 за отговор № 1

Какво ще кажете за това? създавам NSStatusBarItem с обичай NSView с ширина 0 и след това проследяване на него window"Използване на позицията NSWindowWillMoveNotification.

UPDATE: Направих вилица на INAppStoreWindow с персонализирана лента с инструменти, прикрепена към менюто. Виж това.


0 за отговор № 2

Едно нещо, което бихте могли да опитате, е да използвате зададете фалшива (т.е. празна) лента с инструменти на прозореца и след това да го дадете a fullScreenAccessoryView, Този изглед е при преместване в цял екран, премахнат от йерархията на изгледите и приложен под лентата с инструменти. Dunno, обаче, как това работи, когато използвате класа на персонализирания прозорец ...: /


0 за отговор № 3

Опитвах се да постигна точно същото нещо. Успях да го направя, като зададох надзор на заглавната лента в a 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 , който добавя поддръжка за вертикално центриране на заглавието на документа в заглавната лента.