Установка contentInset в WKWebView scrollView вызывает переход страницы наверх - PullRequest
0 голосов
/ 19 ноября 2018

После установки contentInset из WKWebView я обнаружил, что если я использую жест по умолчанию для навигации по страницам, 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))
        }
    }

}

1 Ответ

0 голосов
/ 31 мая 2019

Если вы устанавливаете contentInset для прокрутки WKWebView, вам нужно установить другое свойство 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")

...