Заставьте WKWebView покрывать весь экран

У меня есть WKWebView, который я хочу охватить весь экран. На более новых устройствах, у которых нет физической кнопки «Домой», iOS добавляет белую область под «домашней панелью». Я пытался переопределить safeAreaInsets ведьму, которая отлично работает, чтобы содержимое помещалось под «домашнюю панель», но мне нравится сохранять для верхнего параметра значение по умолчанию. Это потому, что у меня есть панель навигации наверху, которую можно скрыть или показать. Установка UIEdgeInsets(top: 0... заставляет WKWebView идти за моей панелью навигации (очевидно).

Можно ли переопределить только left, bottom и right?

import Foundation
import WebKit

class FullScreenWKWebView: WKWebView {
    override var safeAreaInsets: UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }
}

Спасибо!


person Martin Claesson    schedule 26.02.2019    source источник


Ответы (3)


Разве вы не можете решить эту проблему с помощью автомакета, закрепив веб-просмотр либо в супервизоре, либо в безопасной области, в зависимости от того, что вы хотите?

Во всяком случае, вы, вероятно, могли бы сделать что-то вроде этого:

override var safeAreaInsets: UIEdgeInsets {
    let insets = super.safeAreaInsets
    return UIEdgeInsets(top: insets.top, left: 0, bottom: 0, right: 0)
}
person rodskagg    schedule 26.02.2019
comment
Закрепление WKWebView в его супервизоре по-прежнему ограничивает меня безопасной зоной. Настройка top: insets.top не работает. - person Martin Claesson; 26.02.2019

Так что я понял это, и мальчик, я был неправ. Оказывается, проблема была не в ограничениях, а в том, как WKWebView отображает страницы в безопасных областях. Я понял, что мой WKWebView покрывает весь экран, но не отображает фон под домашней панелью/выемкой. Темно-зеленый цвет определен в html.

iPad с wkwebview, который не покрывает весь экран

Мое решение проблемы состояло в том, чтобы отключить настройку встроенной панели WKWebViews.

webView.scrollView.contentInsetAdjustmentBehavior = .never

Я также создал два верхних ограничения для моего WKWebView с разными приоритетами. Один для safeArea и один для superView. Затем я меняю приоритеты в коде, когда панель навигации видна, чтобы страница не отображалась под панелью навигации.

Результат: Результат без полосы С ограничениями для superView

Результат с полосой С ограничениями на safeArea

person Martin Claesson    schedule 26.02.2019

Я бы не рекомендовал переопределять safeAreaInsets любого UIView напрямую, так как это может привести к неожиданному поведению, как вы сами упомянули.

Эти safeAreaInsets генерируются на более высоком уровне UIViewController, и поэтому должны обрабатываться там.

Я бы посоветовал сделать следующее:

Добавьте этот код в UIViewController, в котором будет храниться ваш FullScreenWKWebView.

 override func viewWillLayoutSubviews() {
     super.viewWillLayoutSubviews()

     additionalSafeAreaInsets.bottom -= bottomLayoutGuide.length
 }

Таким образом, вы сохраните safeAreaInsets исходного UIViewController и просто добавите нужный модификатор для оригинала. Возможность модификации на любом этапе.

person Alex Rypyak    schedule 26.02.2019