prefersLargeTtitles автоматически сворачивается после загрузки веб-страницы WKWebView

У меня проблемы с большими заголовками, сворачивающимися после завершения загрузки веб-страницы в WKWebView. Вот пример GIF того, что происходит.

Я просмотрел весь интернет и нашел два сообщения, которые могут указывать в правильном направлении:

предпочитает большие заголовки, которые не всегда соблюдаются

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?

Изменить: Да - я убедился, что веб-представление является первым представлением в Main.storyboard после безопасной области.

1 ответ

Я столкнулся с той же проблемой и решил ее с помощью этого временного решения.

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

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

Обычно это происходит, когда ваше прокручиваемое представление (UITableView, UICollectionView, UIWebView и т. Д.) Не является первым представлением.

Пожалуйста, проверьте ваш порядок просмотра в Main.storyboard. Соответствующий порядок должен быть таким: 1- Безопасная зона 2 - ваш веб-вид 3 - другие виды...

Если это не работает, попробуйте решить с помощью метода scrollViewDidScroll с изменением режима отображения большой панели навигации в соответствии с contentOffset.y

Недавно я сам столкнулся с этой проблемой и смог решить ее, не используя автоматический макет для размещения веб-представления в увеличенном виде, а вместо этого использовал маску автоматического изменения размера для веб-представления. Надеюсь, это кому-то поможет.

Я могу предложить взлом на основе предложений Тобонаут:

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

Для меня сработало следующее (извините, это в объекте-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;
        }
    }
}
Другие вопросы по тегам