我的目标很简单,但是尽管有很多搜索,但我找不到解决方案。
基本上,当我的应用处于全屏(自助服务终端)模式时,我希望工具栏 仅 自动隐藏,但我想隐藏菜单栏。
显然这种组合无效。我试过了:
- (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions: (NSApplicationPresentationOptions)proposedOptions
{
return (NSApplicationPresentationFullScreen |
NSApplicationPresentationHideDock |
NSApplicationPresentationHideMenuBar |
NSApplicationPresentationAutoHideToolbar);
}
我得到以下异常:
"... fullscreen presentation options must include NSApplicationPresentationAutoHideMenuBar if NSApplicationPresentationAutoHideToolbar is included"
事情是,我根本不想显示菜单栏!
所以,我认为使用标准的演示选项是不可能的。有关如何手动实现此行为的任何想法?
我正在思考:检测鼠标位置,只在鼠标位于屏幕顶部/靠近屏幕顶部时显示/隐藏工具栏。
我对Cocoa很新,所以不确定我会在哪里开始实现这一目标。任何帮助非常感谢!
非常感谢,
约翰
答案 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];
}
_setupToolbarHotspotTrackingView
是SOToolbar
上添加视图的方法,该视图将用于跟踪鼠标位置并相应地显示/隐藏工具栏。
- (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