8

在 WKWebView 中的网页完成加载后,我遇到了大标题折叠的问题。这是发生的事情的 GIF 示例

我浏览了整个互联网,发现了两个可能指向正确方向的帖子:

prefersLargeTitles 并不总是得到尊重 - Apple Developer Forums

prefersLargeTitles - 正确显示片刻然后折叠 - Reddit

我希望大标题在网页加载时出现并保持原位。当用户向上滚动(在网页上向下滚动)时,大标题应该折叠成较小的版本。如果用户返回网页顶部,大标题应该会再次出现。

这是我为 WKWebView 设置的代码:

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest) 
    }
}

一个正确方向的点将不胜感激!可能与它有关scrollView.contentInsetAdjustmentBehavior吗?

编辑:是的 - 我确保 Web 视图是 Main.storyboard 在安全区域之后的第一个视图。

4

5 回答 5

3

我遇到了同样的问题并使用此解决方法解决了它。

override func viewDidLoad() {
    webView.navigationDelegate = self
    webView.scrollView.contentInsetAdjustmentBehavior = .never
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.scrollView.contentInsetAdjustmentBehavior = .automatic
}
于 2019-11-10T17:28:43.053 回答
2

当您的可滚动视图(UITableView、UICollectionView、UIWebView 等)不是第一个视图时,通常会发生这种情况。

请检查您在 Main.storyboard 中的查看顺序。适当的顺序应该是这样的: 1- 安全区域 2 - 您的网络视图 3 - 其他视图...

如果不行,尝试使用scrollViewDidScroll方法解决,根据contentOffset.y改变大导航栏的显示方式

于 2018-08-05T01:03:37.863 回答
1

我最近自己遇到了这个问题,并且能够通过不使用自动布局将 Web 视图定位在较大的视图中而是使用 Web 视图的自动调整大小掩码来解决这个问题。希望这可以帮助某人。

于 2020-05-10T18:11:39.583 回答
1

我可以根据 Tobonaut 的建议提供一个 hack:

class WebViewController: UIViewController {

    var webView: WKWebView!

    fileprivate var firstObservedOffset: CGFloat = 0

    override func viewDidLoad() {
        webView.scrollView.delegate = self
        webView.isHidden = true
    }

    // TODO: implement your loading mechanism

}

extension WebViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.scrollView.contentOffset = CGPoint(x: 0, y: firstObservedOffset)
    }
}

extension WebViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let scrollView = self.webView.scrollView
        let yOffset = scrollView.contentOffset.y
        if yOffset != 0 && firstObservedOffset == 0 {
            firstObservedOffset = yOffset
            return
        }

        guard webView.isHidden
            && firstObservedOffset != 0
            && scrollView.contentOffset.y != firstObservedOffset else {
            return
        }

        scrollView.contentOffset = CGPoint(x: 0, y: firstObservedOffset)
    }
}
于 2019-02-08T11:37:15.760 回答
0

以下对我有用(对不起,它在objective-C中)。

- (void)viewDidLoad {

    [super viewDidLoad];
    self.webView.navigationDelegate = self;
    self.webView.scrollView.delegate = self;
    self.webView.scrollView.scrollEnabled = YES;
    [_webView loadHTMLString:_htmlString baseURL:_baseURL];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (scrollView == _webView.scrollView) {
        if (_webView.isLoading) {
            [_webView.scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
            return;
        }
    }
}
于 2019-05-08T04:35:14.893 回答