加载WKWebView网页后,prefersLargeTtitles自动折叠

时间:2018-08-04 15:19:28

标签: ios swift xcode wkwebview preferslargetitles

在WKWebView中的网页完成加载后,大标题崩溃了。 Here is GIF example of what happens

我在互联网上看了很多,发现有两个帖子可能指向正确的方向:

prefersLargeTitles not always honored - Apple Developer Forums

prefersLargeTitles - Displays correctly for a split second then collapses - 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中安全区域之后的第一个视图。

5 个答案:

答案 0 :(得分:2)

通常在您的可滚动视图(UITableView,UICollectionView,UIWebView等)不是第一个视图时发生。

请在Main.storyboard中检查您的视图顺序。适当的顺序应如下所示: 1-安全区 2-您的网络视图 3-其他意见...

如果不起作用,请尝试使用scrollViewDidScroll方法解决,方法是根据contentOffset.y更改大型导航栏的显示模式

答案 1 :(得分:0)

我可以根据Tobonaut的建议进行修改:

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

答案 2 :(得分: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;
        }
    }
}

答案 3 :(得分:0)

我遇到了相同的问题,并使用此变通办法解决了该问题。

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

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

答案 4 :(得分:0)

我最近刚刚遇到了这个问题,并且能够通过不使用自动布局将Web视图放置在较大视图中来解决此问题,而是对Web视图使用了自动调整大小的蒙版。希望这对某人有帮助。