Swift 加载 WKWebview 时 prefersLargeTitles 崩溃

Swift prefersLargeTitles collapsed when WKWebview loaded

我用这段代码创建了一个带有大标题 NavigationBarNavigationController

class NavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let appearance = UIBarButtonItem.appearance()
        appearance.setBackButtonTitlePositionAdjustment(UIOffset.init(horizontal: 0.0, vertical: -60), for: .default)

        self.navigationBar.barTintColor = UIColor.white
        self.navigationBar.prefersLargeTitles = true
        self.navigationBar.isTranslucent = true
        self.navigationBar.tintColor = UIColor.black
    }
}

一切正常,但是当我的 WKWebView 加载时,大标题栏不知何故自动折叠,没有任何 ScrollViewDelegate 代码。请在这里查看我的 gif 以澄清

这是我的 WKWebView 代码。

class resultViewController: UIViewController
{
    private var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white

        webView = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))
        webView.navigationDelegate = self
        webView.scrollView.delegate = self
        self.view.addSubview(webView)
        let url = URL(string: "https://google.com")
        webView.load(URLRequest(url: url!))
    }

}

我希望在第一个屏幕上保持大标题栏可见,并且仅在触发向上滚动事件时才折叠。

有什么想法吗?

  • 这个问题的原因是当您的 webView 开始加载页面时,您的导航栏高度正在改变。所以使用 viewLayoutMarginsDidChange() 我们可以改变导航栏的高度。
  • viewLayoutMarginsDidChange() 调用以通知视图控制器其根视图的布局边距已更改。每次导航栏高度变化时都会调用此方法。

参考这个答案