让 WKWebView 覆盖整个屏幕

Posted

技术标签:

【中文标题】让 WKWebView 覆盖整个屏幕【英文标题】:Make WKWebView cover the whole screen 【发布时间】:2019-02-26 09:49:39 【问题描述】:

我有一个想要覆盖整个屏幕的 WKWebView。在没有物理主页按钮的较新设备上,ios 在“主页栏”下添加了一个白色区域。我试图覆盖safeAreaInsets 女巫工作正常,使内容进入“homebar”,但我喜欢将顶部参数保持为其默认值。这是因为我在顶部有一个导航栏,可以隐藏或显示女巫。设置 UIEdgeInsets(top: 0... 会使 WKWebView 位于我的导航栏后面(显然)。

是否只覆盖leftbottomright

import Foundation
import WebKit

class FullScreenWKWebView: WKWebView 
    override var safeAreaInsets: UIEdgeInsets 
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    

谢谢!

【问题讨论】:

【参考方案1】:

所以我想通了,男孩,我错了。事实证明,约束不是问题,而是 WKWebView 如何在安全区域呈现页面。我发现我的 WKWebView 覆盖了整个屏幕,但没有在主栏/凹槽下呈现背景。深绿色是在 html 中定义的。

我的解决方案是禁用 WKWebViews bultin 调整。

webView.scrollView.contentInsetAdjustmentBehavior = .never

我还为我的 WKWebView 创建了两个具有不同优先级的顶部约束。一个到 safeArea,一个到 superView。然后我在导航栏可见时更改代码中的优先级,以便页面不会在导航栏下呈现。

结果: 对 superView 有限制

对安全区域有限制

【讨论】:

【参考方案2】:

你不能使用自动布局来解决这个问题,通过将 webview 固定到超级视图或安全区域,这取决于你想要什么?

无论如何,你可能会做这样的事情:

override var safeAreaInsets: UIEdgeInsets 
    let insets = super.safeAreaInsets
    return UIEdgeInsets(top: insets.top, left: 0, bottom: 0, right: 0)

【讨论】:

将 WKWebView 固定到它的超级视图仍然将我限制在安全区域。设置top: insets.top 不起作用。【参考方案3】:

我不建议直接覆盖任何UIViewsafeAreaInsets,因为它可能会导致您自己提到的意外行为。

这些safeAreaInsets 是在更高的UIViewController 级别上生成的,因此应该在那里处理。

我宁愿建议如下:

将此代码添加到将保存您的FullScreenWKWebViewUIViewController

 override func viewWillLayoutSubviews() 
     super.viewWillLayoutSubviews()

     additionalSafeAreaInsets.bottom -= bottomLayoutGuide.length
 

这样您将保留原始UIViewControllersafeAreaInsets 并简单地为原始添加所需的修饰符。允许在任何阶段进行修改。

【讨论】:

以上是关于让 WKWebView 覆盖整个屏幕的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该使用 wkWebView?

WKWebView的evaluateJavascript方法的completionHandler运行在啥线程上?

带有 WKWebView 单元格的滚动 UICollectionView 的 UITableView

在 iOS 9 中遇到 WKWebview 和 UIWebView 问题

css 关于width:100%的问题 本身的页面超过了整个屏幕的大小,也就是有滚动条,但是它只能覆盖屏幕大小

使用WKWebView自适应屏幕遇到的问题以及最后解决的方法