Я пытаюсь создать метод, который будет переключаться между полноэкранным режимом и окном. Я пытаюсь сделать это из класса, унаследованного от NSOpenGLView, по существу следуя это сообщение в блоге. Это работает один раз при переходе из оконного режима в полноэкранный; попытка вернуться назад терпит неудачу по-разному: экран окна не обновляется, или мне даже не удается переключиться в окно, но полноэкранный режим просто гаснет. В любом случае, пытаясь несколько раз перейти туда и обратно (сопоставил это с клавишей «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