【问题标题】:Resize views when menubar autohides/appear in fullscreen mode当菜单栏在全屏模式下自动隐藏/出现时调整视图大小
【发布时间】:2014-05-14 05:58:47
【问题描述】:

我正在开发一个支持全屏模式的 OSX 应用。

该窗口是从一个 nib 文件生成的,但其他所有内容都以编程方式处理。

当我进入全屏模式时,我的视图会正确调整大小,但是当菜单栏出现/消失时,不会为 contentView 或我自己的视图调用 setFrame。我会收到通知

是否有一个委托来实现捕获这些通知?还是我必须继承 NSWindow 并找出 Safari 如何通过反转它来处理其菜单栏?

【问题讨论】:

    标签: objective-c cocoa fullscreen menubar


    【解决方案1】:

    经过一些研究,我至少可以通过子类化窗口的内容视图并将以下代码添加到 setFrame 方法中,然后调用 super:

    //isFullscreen
    if(([self.window styleMask] & NSFullScreenWindowMask) == NSFullScreenWindowMask)
    {
        frameRect.size.height = self.window.frame.size.height;
        frameRect.size.width = self.window.frame.size.width;
    }
    

    在调用 setFrame 之前,窗口被调整为屏幕大小,因此我们可以使用它的大小将 frameRect 更新为窗口的大小。

    【讨论】:

    • 我遇到了同样的问题,但我不明白这是如何解决的。我什至不确定如何捕捉“menubar-did-show”事件。你能解释一下吗?
    • 基本上,窗口会根据屏幕大小调整大小,但由于一些动画(我猜),它调整内容大小是为菜单栏保留空间的一种方式,用于对其进行动画处理,然后“忘记”通知窗口的内容这不是最终大小。使用这个技巧,我强制内容视图坚持整个窗口的大小。
    • 所以setFrame在窗口改变大小时被调用?然后在全屏模式下,当窗口大小发生变化时,您只需更改窗口的高度,这仅在菜单栏自动显示时发生?
    • 是的,窗口内容的大小在全屏模式下不应该改变(除非你改变活动屏幕),所以你可以覆盖你收到的高度
    • 我可以看看你的完整 setFrame 方法吗?
    【解决方案2】:

    看看一些代码会很有帮助,“你的视图如何正确调整大小”。

    但接下来的信息可能会有所帮助:

    当窗口进入全屏状态时,它会在全屏动画结束后占据整个屏幕。主菜单栏显示在窗口上方(“上方”是指 z 排序)。因此,当主菜单栏显示/隐藏窗口的框架时,内容视图不会改变。 另请注意, -[NSScreen visibleFrame] 返回未占用的帧。并且直到全屏动画结束才会返回整个屏幕帧。

    【讨论】:

    • 全屏主要是作为经典的调整大小处理的,所以没有太多的代码可以展示,主要是将调整大小传播到整个视图层次结构的技巧。似乎响应 windowDidEnterFullScreen 并调整内容视图的大小就可以了。但是,仍然存在两个问题:启动时有一个奇怪的行为,在动画仍在进行时会调用 windowDidEnterFullScreen (height + origin.y = screen height - MB height);并且在动画期间, visibleFrame 仍然返回可用区域减去菜单栏,所以当 windowDidEnterFullScreen 被调用时,我仍然很短。
    • 另外,当菜单栏出现时,我仍然无法轻松处理 GUI 的反应
    猜你喜欢
    • 2015-08-10
    • 2016-12-05
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多