11

所以现在我有一个 NSWindow ,它使用INAppStoreWindow像 NSToolbar 一样绘制自己,我想知道当应用程序全屏时菜单栏移动时是否有任何类型的事件或消息发送,以便我可以移动响应窗口的标题栏(标准 NSToolbar 的工作方式)。显然 NSToolbar 知道一些我不知道的东西,它可以让我免于在窗口的上部制作 NSTrackingArea。

这是它现在的作用:

前

这就是我想做的事情:

在此处输入图像描述

不幸的是,KVO'ing afullScreenAccessoryView也不能正常工作。框架事件仅在进入和退出全屏模式时生成,而不是在工具栏被状态栏“向下移动”时生成。

4

3 回答 3

2

这个怎么样?使用具有宽度NSStatusBarItem的自定义创建,然后使用.NSView0windowNSWindowWillMoveNotification

更新:我制作了INAppStoreWindow的一个分支,并在菜单栏上附加了一个自定义工具栏。检查出来

于 2012-10-12T20:45:32.277 回答
0

您可以尝试的一件事是在窗口上设置一个假的(即空的)工具栏,然后给它一个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:方法的实现中,通过比较它的superview框架的最后一个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 回答