0

我的应用程序最初有一个窗口 (Def)。然后它产生了一个新窗口(New)。所有两个窗口都可以从窗口子菜单项或空间控件切换。

但是,如果我尝试在 OSX 10.6.8 上将“新建”窗口设置为假全屏模式,那么如果我通过菜单或空间控制切换到“默认”窗口,就会出现问题。我无法“完全”切换回“新建”窗口。

     // setting a fake full screen window on 10.6.8
     NSApplicationPresentationOptions prereqOptions =
        NSApplicationPresentationAutoHideDock |
        NSApplicationPresentationAutoHideMenuBar;
     [[NSApplication sharedApplication]
        setPresentationOptions:prereqOptions];

     [[self window] setToolbar:nil];
     [[self window] setStyleMask:NSBorderlessWindowMask];
     [[self window] setFrame:[[NSScreen mainScreen] frame]
                     display:YES];

“完全”意味着我可以看到“新建”被带到屏幕顶部,但窗口控制器无法收到通知“NSWindowDidBecomeKeyNotification”。此外,通过[NSApp keyWindow],我可以看到关键窗口始终是“Def”。而且我总能看到在 Window 子菜单中选中了“Def”。

有人遇到过这个问题吗?

4

1 回答 1

0

最后经过2天的调查,答案回到了NSWindow的文档。

有两种相关的方法。

  • (BOOL)canBecomeKeyWindow 返回值 如果窗口可以成为关键窗口,则为 YES,否则为 NO。

讨论 如果此方法返回 NO,则放弃使窗口成为关键窗口的尝试。如果窗口有标题栏或调整大小栏,则 NSWindow 实现返回 YES,否则返回 NO。

canBecomeMainWindow 指示窗口是否可以成为应用程序的主窗口。

  • (BOOL)canBecomeMainWindow 返回值 YES 当窗口可以成为主窗口时;否则,否。

讨论 如果此方法返回 NO,则放弃将窗口设为主窗口的尝试。如果窗口可见、不是 NSPanel 对象并且具有标题栏或调整大小机制,则 NSWindow 实现返回 YES。否则返回 NO。

所以结论是,如果窗口没有标题栏或调整大小栏,则默认情况下它不能成为主窗口和关键窗口。在10.6.8上通过[NSWindow setStyleMask:NSBorderlessWindowMask]设置窗口为假全屏时,标题栏是锣。

要解决此问题,需要通过返回 YES 来覆盖上述 2 个方法。

于 2013-05-07T07:50:38.280 回答