ios - WKWebView 内容的顶部被剪裁在 Mac Catalyst 中的 NSToolbar 下

标签 ios swift macos appkit mac-catalyst

我有一个催化剂应用程序,它在 UINavigationController 中有一个 WKWebView。在 iOS 上,我在 Web View 上方有一个导航栏,如下所示: [Image]

但是,在 macOS 上,我隐藏了导航栏并显示 NSToolbar。但是,WebView 的内容被剪切到工具栏下方: [Image]

(请注意,向下滚动网页 View 后,内容不再被剪切)

如何设置 WKWebView 以使内容不会被剪切到工具栏下方?

最佳答案

在我的 Catalyst 应用程序中尝试使用 AppKit 桥之后,我确定了问题的原因:Catalyst 窗口的 styleMask 包含 .fullSizeContentView,它用于使 NSWindow 中的 View 在标题栏/工具栏下方扩展(这就是在 Safari 等应用程序中启用半透明工具栏的原因)。无论出于何种原因,WKWebView 都没有正确处理它,这就是导致内容被裁剪的原因。

作为解决方法,我在 AppKit bundle 中的一个方法中添加了一个 NSWindow.didBecomeMainNotification 的观察者,该方法在应用程序首次启动时运行(对于我的用例,我只担心主窗口)。因此,当窗口成为应用程序的“主”窗口时,将调用以下方法:

    @objc func setWindow(_ sender: Notification) {
        if let w = sender.object as? NSWindow {
            if w.styleMask.contains(.fullSizeContentView){
                var sm = w.styleMask
                sm.remove(.fullSizeContentView)
                w.styleMask = sm
            }
        }
    }

这会从窗口的 styleMask 中删除 .fullSizeContentView,因此,WKWebView 的内容在首次出现时不再被剪裁出现。

我应该注意到,解决方法并不完美 - 工具栏下将不再有半透明效果。

如果您想将 AppKit Bundle 添加到 Catalyst 应用程序,以下资源应该会有所帮助

https://crunchybagel.com/disabling-the-mac-zoom-maximise-button-in-catalyst/ https://www.highcaffeinecontent.com/blog/20190607-Beyond-the-Checkbox-with-Catalyst-and-AppKit

如果您仍然感到困惑,我建议您使用我找到的下面的演示项目: https://github.com/noahsark769/CatalystPlayground

关于ios - WKWebView 内容的顶部被剪裁在 Mac Catalyst 中的 NSToolbar 下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60728083/

相关文章:

ios - 无法执行存储在 Array[Any] 中的对象的方法

swift - 自定义 iOS 导航栏

objective-c - 如何防止对 NSOutlineView 的父节点进行排序?

json - 解析 JSON Swift 3 字典

ios 9 UIPopoverPresentationController 旋转时的恒定放置

macos - 如何运行完整的 Haskell 程序

适用于 Mac 和 Win 的 Java 应用程序安装程序和启动程序?

iphone - Objective c - 使用一个或多个 ViewController 在 View 之间翻转?

ios - 将iphone应用上传到appstore时出错

ios - UILabel 新文本值未在 XCUITest 内更新