【问题标题】:Make Cocoa Window Fullscreen使可可窗口全屏
【发布时间】:2017-07-01 11:14:58
【问题描述】:

我目前正在为 OS X 中的 OpenGL 窗口添加全屏视图。我没有使用 OS X 的“全屏模式”,因为我不喜欢接管用户屏幕的想法。

我有自己的自定义窗口类,它派生自 NSWindow,在该类中,我覆盖了 toggleFullscreen: 选择器:

- (void)toggleFullScreen:(id)sender
{
    _fullscreen = !_fullscreen;
    if(_fullscreen) {
        NSRect screenRect = [[NSScreen mainScreen] frame];
        [self setStyleMask:NSBorderlessWindowMask];
        [self setFrame:screenRect display:YES];
        [self setLevel:NSMainMenuWindowLevel+1];
        [self setOpaque:YES];
        [self setHidesOnDeactivate:YES];
    } else {
        NSRect screenRect = [[NSScreen mainScreen] frame];
        unsigned int width = (unsigned int)(screenRect.size.width/2.0f);
        unsigned int height = (unsigned int)(screenRect.size.height/2.0f);
        NSRect frame = NSMakeRect(0, screenRect.size.height-height, width, height);

        [self setStyleMask:NSTitledWindowMask | NSResizableWindowMask];
        [self setFrame:frame display:YES];
        [self setLevel:NSNormalWindowLevel];
        [self setOpaque:YES];
        [self setHidesOnDeactivate:NO];
    }
}

这似乎工作正常,在全屏窗口(根据 Apple 的文档 here)和屏幕分辨率一半的窗口之间切换。

问题是在两种模式之间切换会使我的窗口“失去焦点”。如果我在切换模式后立即按下我正在使用的键盘快捷键,我会收到 OS X 错误“哔”。我必须在窗口中单击以“重新激活”它,然后才能再次使用切换。

我尝试将[self makeKeyAndOrderFront:nil]; 添加到我的函数中,但这并不能解决问题。我所需要的只是一种在过渡期间保持窗口“聚焦”的方法。除了那个问题,这个方法运行良好,不需要更改我的NSView

编辑

不确定它是否相关,但我正在以编程方式创建此窗口,而不是从 Nib 加载它。

【问题讨论】:

  • 无边框窗口默认不是关键所以你需要覆盖-canBecomeKeyWindow: -(BOOL)canBecomeKeyWindow { return YES;另外我建议使用-setFrame:display:animate: 而不是-setFrame:display 然后你会得到漂亮的动画。
  • @JustinBoo:添加canBecomeKeyWindow 似乎没有什么不同。至于渲染,我使用的是CVDisplayLink :-)
  • 作为记录,有一个很好的页面与相关信息here,但它似乎也没有提供一个好的解决方案。有人说使用NSWindowController 可以解决问题,但这对我不起作用。

标签: objective-c macos cocoa opengl fullscreen


【解决方案1】:

一种更简单的方法,似乎是正确的现代方法(如 Lion)...

在我的 NSApplicationDelegate 的 init 方法中(对不起,我是新手,所以我的术语是错误的),在创建窗口之后...

[window setCollectionBehavior:(NSWindowCollectionBehaviorFullScreenPrimary)];

然后触发toggleFullScreen,比如从你的菜单中,target = nil。

然后它将创建一个带有图标的新命名桌面,将您的窗口滑动到它并使其全屏显示。就像您将它们设为全屏时的 Google Chrome 或 Safari 一样。我也是在没有笔尖或 xib 或现在孩子们所说的任何东西的情况下这样做。

This page 谈到了使用 Interface Builder 的方式。

This 是有关该主题的 Apple 官方文档。

【讨论】:

    【解决方案2】:

    我自己遇到了这个问题,发现在 setStyleMask 之前调用它:

    [window orderOut:nil];
    

    在 setStyleMask 为我解决了失去焦点的问题之后:

    [window makeKeyAndOrderFront:nil];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2016-03-30
      相关资源
      最近更新 更多