我正在尝试创建一种在全屏和窗口之间切换的方法。我试图从继承自 NSOpenGLView 的类中执行此操作,基本上遵循此 blogpost。一次有效,从窗口到全屏;尝试返回以各种方式失败:窗口屏幕没有更新,或者我什至没有管理切换到窗口但全屏只是空白。无论如何尝试来回几次(将其映射到'f'键),程序经常锁定,在最坏的情况下,我必须重新启动计算机。我附上了以下方法的代码;出于调试目的,我将全帧矩形设置得更小,这样如果冻结,应用程序永远不会全屏显示。
Apple 开发人员示例中的全屏示例建议使用控制器,并且不会从继承的 NSOpenGLView 中全屏显示。
我的问题:
- 我应该改用控制器,然后在窗口和全屏之间切换(每次创建一个单独的全屏视图)?或者这两种方法都应该有效吗?
- 如果这两种方法都应该有效,那么首选哪一种?
- 如果这两种方法都可以工作,那么我在当前的实现方式中做错了什么?
- 或者,是否有第三种更好的方法?
请注意,对于这两个参考,我必须假设 10.8 的情况没有改变(这两个参考似乎都适用于 10.6)。
代码如下:
@implementation MyOpenGLView
[...]
- (void)toggleFullscreen
{
mainWindow = [self window];
if (isFullscreen) {
[fullscreenWindow close];
[mainWindow setAcceptsMouseMovedEvents:YES];
[mainWindow setContentView: self];
[mainWindow makeKeyAndOrderFront: self];
[mainWindow makeFirstResponder: self];
isFullscreen = false;
} else {
[mainWindow setAcceptsMouseMovedEvents:NO];
//NSRect fullscreenFrame = [[NSScreen mainScreen] frame];
NSRect fullscreenFrame = { {300, 300}, {300, 300} };
fullscreenWindow = [[NSWindow alloc] initWithContentRect:fullscreenFrame
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO];
if (fullscreenWindow) {
[fullscreenWindow setAcceptsMouseMovedEvents:YES];
[fullscreenWindow setTitle:@"Full screen"];
[fullscreenWindow setReleasedWhenClosed: YES];
[fullscreenWindow setContentView: self];
[fullscreenWindow makeKeyAndOrderFront: self];
//[fullscreenWindow setOpaque:YES];
//[fullscreenWindow setHidesOnDeactivate:YES];
// Set the window level to be just above the menu bar
//[fullScreenWindow setLevel:NSMainMenuWindowLevel+1];
// Set the window level to be just below the screen saver
[fullscreenWindow setLevel:NSScreenSaverWindowLevel-1];
[fullscreenWindow makeFirstResponder:self];
isFullscreen = true;
} else {
NSLog(@"Error: could not switch to full screen.");
}
}
}
[...]
@end