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