ios - 设置WKWebView scrollView的contentInset导致页面跳转到顶部

标签 ios swift uiscrollview wkwebview

设置WKWebViewcontentInset后,我发现如果我使用默认滑动手势在页面之间导航,WKWebView不会保留contentInset跳转到到顶部,有谁知道如何解决这个问题?谢谢!

enter image description here

我的示例代码:

import UIKit
import WebKit

class ViewController: UIViewController {

    private lazy var webView: WKWebView = {
        let view = WKWebView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
        view.allowsBackForwardNavigationGestures = true
        view.scrollView.contentInsetAdjustmentBehavior = .never
        view.scrollView.contentInset = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)

        view.navigationDelegate = self
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.view.addSubview(self.webView)

        if let url = URL(string: "http://www.wikipedia.org") {
            self.webView.load(URLRequest(url: url))
        }
    }

}

最佳答案

如果为 WKWebView 的 ScrollView 设置 contentInset,则需要为 WKWebview 的另一个属性设置相同的值。 view.setValue(UIEdgeInsets, forKey: "_obscuredInsets")

引用:https://opensource.apple.com/source/WebKit2/WebKit2-7600.1.4.11.10/ChangeLog

private lazy var webView: WKWebView = {
        let view = WKWebView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
        view.allowsBackForwardNavigationGestures = true
        view.scrollView.contentInsetAdjustmentBehavior = .never
        let edgeInsets = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)
        view.setValue(edgeInsets, forKey: "_obscuredInsets")
        view.scrollView.contentInset = edgeInsets
        return view
    }()

如果你设置contentInsetAdjustmentBehavior = .automatic,状态栏会有一个额外的边缘。您还需要将状态栏高度添加到 obscuredInsets。

view.scrollView.contentInsetAdjustmentBehavior = . automatic
webView.scrollView.contentInset = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)
webView.setValue(UIEdgeInsets(top: 50 + 44, left: 0, bottom: 0, right: 0), forKey: "_obscuredInsets")

44是状态栏(safeArea)的高度。


检查了最新的 WKWebView:https://github.com/WebKit/webkit/blob/master/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

现在需要添加一个额外的属性:_haveSetObscuredInsets

webView.setValue(true, forKey: "_haveSetObscuredInsets")

关于ios - 设置WKWebView scrollView的contentInset导致页面跳转到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374195/

相关文章:

swift - 在运行时确定协议(protocol)类型

swift - 在 Swift 中将点击手势识别器分配给 ScrollView 内的图像

iphone - 在 UIImagePickerController 之后直接调用 MFMailComposeViewController

ios - 解析 iOS 地理定位应用程序的 json

swift - 带有基于 iOS 的 WatchKit-Extension 的 RealmSwift-1.2 和 iOS-9(全部在 iPhone 上)

objective-c - 如何将Scrollview滚动到边界之外

ios - UIScrollView 仅在任意应用程序交互后有效

ios - 如何使用 SearchBar API?

ios - 当应用程序处于后台模式时,如何通过套接字保持与服务器的连接?

ios - Xcode 版本 6.2 没有 iOS 8.3 构建目标