Обнаружение движения в полноэкранном меню
Итак, прямо сейчас у меня есть 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, которая добавляет поддержку вертикального центрирования заголовка документа в заголовке.