我想創建一個方法,將在全屏和窗口之間切換。我試圖從一個繼承自NSOpenGLView的類中執行此操作,
基本上跟在
this blogpost
之後。從窗口到全屏從一次工作一次;試圖以各種方式返回失敗:窗口屏幕沒有得到更新,或者我甚至不管理切換到窗口,但全屏幕只是空白。無論如何都試着來回反覆(映射到'f'鍵),程序經常會鎖定,在最壞的情況下,我必須重新啓動計算機。 我已經附上了以下方法的代碼;出於調試目的,我已經將整個框架矩形設置的更小,所以如果事情凍結,應用程序永遠不會處於全屏狀態。NSOpenGLView切換到全屏從視圖
Apple開發人員示例中的fullscreen example建議使用控制器,並且不會從繼承的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
我想你的第一個例子,它只是一個CGL全屏幕表面。有關更多詳細信息,請參閱Robert P. Kuehne的書。 – 2016-02-18 22:31:37