Objective-C桌面Cocoa ap。该应用程序是一个高度特定的边缘情况(具有一键式界面的独立信息亭)。我首先提到这一点,希望避免HIG演讲。 ;)
我正在使用模态工作表视图在我平常的内容之上显示PDF文档。代码非常简单:
[docViewerHostWindow beginSheet:docViewer completionHandler:nil];
DocViewerHostWindow是一个NSWindow,作为调用工作表的NSView的父级访问。如果重要,“docViewer”是NSWindow的子类,包含PDFView。
当应用程序在窗口中运行时,一切都按预期运行。当应用程序运行全屏时,事情就像宣传的一样,但是存在视觉上的故障:模型背后的整个内容向右移动直到工作表被解除。看起来这是故意(和动画),但我无法弄清楚它来自何处或如何禁用它。
我以这种方式进入全屏:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],NSFullScreenModeAllScreens,nil];
[self enterFullScreenMode:[NSScreen mainScreen] withOptions:options];
这个基本的NSLog说明了这个问题:
NSLog(@"Before: %f,%f",docViewerHostWindow.frame.origin.x,docViewerHostWindow.frame.origin.y);
[docViewerHostWindow beginSheet:docViewer completionHandler:nil];
NSLog(@"After: %f,%f",docViewerHostWindow.frame.origin.x,docViewerHostWindow.frame.origin.y);
**Log when running windowed (same origin before and after) **
2015-08-09 22:52:46.641 Before: 311.000000,491.000000
2015-08-09 22:52:47.050 After: 311.000000,491.000000
**Log when running fullscreen (origin shifts in fullscreen) **
2015-08-09 22:52:46.641 Before: 0.000000,0.000000
2015-08-09 22:52:47.050 After: 80.000000,-23.000000
我试图在打开纸张之前和之后强制窗口的原点,但这没有帮助。我甚至不确定在哪里看 - 有什么原因导致这个和为什么?
更新:要明确我不是在谈论工作表本身的默认动画(如this question中所述),而是主机窗口发生这种情况,但仅限于在全屏。
答案 0 :(得分:1)
看到的效果是应用程序移出(隐形)底座和菜单栏(感谢@KenThomases,其评论帮助解决了这个问题)。除了上面接受的答案,我还找到了另一个解决方案:
Apple提供了许多kiosk mode tricks,这些都很有帮助,特别注意他们通过向awakeFromNib添加代码来隐藏菜单栏和停靠栏的示例。
然而,这在非自助服务终端ap中并不理想,我们希望只在全屏模式下使用自助服务终端选项。幸运的是,这可以通过将选项传递给enterFullScreenMode:withOptions:来实现。当我们退出FullScreenMode:withOptions
时,将恢复常规演示模式选项文档有点薄,但这就是诀窍:
NSApplicationPresentationOptions kioskOptions = NSApplicationPresentationHideDock + NSApplicationPresentationHideMenuBar;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO],NSFullScreenModeAllScreens,
[NSNumber numberWithInteger:kioskOptions],NSFullScreenModeApplicationPresentationOptions, nil];
[self enterFullScreenMode:[NSScreen mainscreen] withOptions:options];
答案 1 :(得分:0)
这个问题显然与避开Dock的窗口有关。
我认为这也与您在全屏模式下放置视图而非窗口这一事实有关。执行此操作时,视图将从其正常窗口移出。但是,当你在视图窗口开始一张纸时,你可以把它带回到图片中,可以这么说。 (您可以检查视图的window
属性是否与进入全屏模式之前的窗口实际上是同一个窗口。如果不是,您实际上没有业务将工作表附加到它。)
我建议您使用无边框窗口,其位置覆盖屏幕,窗口级别为NSStatusWindowLevel + 1
。这是Apple的OpenGL Programming Guide for Mac: Drawing to the Full Screen推荐的技术(诚然,这是你正在使用的一个不同的背景)。所以,你不会使用-[NSView enterFullScreenMode:withOptions:]
。如果你想为kiosk-mode-type行为设置应用程序的presentationOptions
,你也可以这样做。