仅在Cocoa中以全屏模式自动隐藏工具栏

时间:2015-08-10 16:00:53

标签: xcode cocoa

我的目标很简单,但是尽管有很多搜索,但我找不到解决方案。

基本上,当我的应用处于全屏(自助服务终端)模式时,我希望工具栏 自动隐藏,但我想隐藏菜单栏。

显然这种组合无效。我试过了:

- (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions: (NSApplicationPresentationOptions)proposedOptions
{
    return (NSApplicationPresentationFullScreen |
        NSApplicationPresentationHideDock |
        NSApplicationPresentationHideMenuBar |
        NSApplicationPresentationAutoHideToolbar);
}

我得到以下异常:

"... fullscreen presentation options must include NSApplicationPresentationAutoHideMenuBar if NSApplicationPresentationAutoHideToolbar is included"

事情是,我根本不想显示菜单栏!

所以,我认为使用标准的演示选项是不可能的。有关如何手动实现此行为的任何想法?

我正在思考:检测鼠标位置,只在鼠标位于屏幕顶部/靠近屏幕顶部时显示/隐藏工具栏。

我对Cocoa很新,所以不确定我会在哪里开始实现这一目标。任何帮助非常感谢!

非常感谢,

约翰

1 个答案:

答案 0 :(得分:2)

我已经让它工作了,但只能使用私有API。

首先,我必须找出如何防止菜单栏出现。我发现了来自Carbon的函数_HIMenuBarPositionLock_HIMenuBarPositionUnlock(将应用程序与Carbon.framework联系起来)。

然后我必须在awakeFromNib创建NSToolbar的自定义子类。当窗口进入和退出全屏时,我会注册通知观察者来锁定和解锁菜单栏:

- (void)awakeFromNib
{
    [super awakeFromNib];

    [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillEnterFullScreenNotification object:[self _window] queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        // lock menubar position when entering fullscreen so It doesn't appear when the mouse is at the top of the screen
        _HIMenuBarPositionLock();
    }];
    [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillExitFullScreenNotification object:[self _window] queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        // unlock menubar position when exiting fullscreen
        _HIMenuBarPositionUnlock();
    }];

    [self _setupToolbarHotspotTrackingView];
}

_setupToolbarHotspotTrackingViewSOToolbar上添加视图的方法,该视图将用于跟踪鼠标位置并相应地显示/隐藏工具栏。

- (void)_setupToolbarHotspotTrackingView
{
    NSView *contentView = [self _window].contentView;

    self.toolbarHotspotTrackingView = [[SOToolbarTrackingView alloc] initWithFrame:contentView.bounds];
    [contentView addSubview:self.toolbarHotspotTrackingView];
    self.toolbarHotspotTrackingView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable;
    self.toolbarHotspotTrackingView.toolbar = self;
}

我还必须覆盖_attachesToMenuBar上的SOToolbar,以便动画正常运行。

- (BOOL)_attachesToMenuBar
{
    return NO;
}

SOToolbarTrackingView为鼠标移动事件设置跟踪区域,并检查鼠标是否位于窗口顶部。然后它调用私有类NSToolbarFullScreenWindowManager上的一些方法来显示和隐藏工具栏。

这里有太多东西要解释这一切,我上传了我的实验项目,你可以看看。 Download the sample project here