在WKWebView加载网页后,prefersLargeTitles自动折叠。

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有关吗?
编辑:是的 - 我确保 WebView 是安全区域后 Main.storyboard 中的第一个视图。

你最终是怎么解决这个问题的? - SAHM
5个回答

3
我遇到了同样的问题,并使用这个解决方法解决了它。
override func viewDidLoad() {
    webView.navigationDelegate = self
    webView.scrollView.contentInsetAdjustmentBehavior = .never
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.scrollView.contentInsetAdjustmentBehavior = .automatic
}

2

通常情况下,当您的可滚动视图(如UITableView,UICollectionView,UIWebView等)不是第一个视图时,会出现此问题。

请检查Main.storyboard中的视图顺序。正确的顺序应该是这样的: 1- 安全区域 2 - 您的Web视图 3 - 其他视图...

如果仍然无法解决,请尝试使用scrollViewDidScroll方法,并根据contentOffset.y更改大型导航栏的显示模式来解决问题。


谢谢您的帮助!我已经将Web View设置为安全区域后的第一个视图。我会研究您的其他建议! - Miguel
@Tobonaut 这不是一个可行的解决方案吗?你遇到了什么问题? - Oliver
1
@Oliver 不,它不起作用。我有相同的设置。我的解决方法是(是的,有点hacky),通过使用scrollview委托重置web视图的内部scrollview的内容偏移,直到webview委托引发完成方法。 - Tobonaut
@Tobonaut 我还没有找到解决方法。 :( 我只好删除大标题,改用较小的居中标题。 - Miguel

1

最近我也遇到了这个问题,通过不使用自动布局来定位网页视图在较大视图中,而是使用网页视图的自动调整大小掩码来解决了这个问题。希望这能对某些人有所帮助。


哇,这对我真的有效,而其他所有的hack都没有。谢谢! - Stefan

1
我可以基于Tobonaut的建议提供一个hack:

我可以基于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)
    }
}

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;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接