Заставьте WKWebView покрыть весь экран - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть WKWebView, который я хочу охватить весь экран.На новых устройствах, у которых нет физической кнопки «Домой», iOS добавляет белую область под «домашней панелью».Я попытался переопределить safeAreaInsets, ведьма отлично работает, чтобы содержимое переместилось под «домашнюю панель», но id хотел бы сохранить для верхнего параметра значение по умолчанию.Это потому, что у меня есть панель навигации в верхней части окна, которая может быть скрыта или показана.Установка 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)
    }
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

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

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

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

Добавить этот код к UIViewControllerэто будет держать ваш FullScreenWKWebView.

 override func viewWillLayoutSubviews() {
     super.viewWillLayoutSubviews()

     additionalSafeAreaInsets.bottom -= bottomLayoutGuide.length
 }

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

0 голосов
/ 26 февраля 2019

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

iPad with wkwebview that didn't cover the whole screen

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

webView.scrollView.contentInsetAdjustmentBehavior = .never

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

Результат: Result with no bar С ограничениями на superView

Result with bar С ограничениями на safeArea

0 голосов
/ 26 февраля 2019

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

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

override var safeAreaInsets: UIEdgeInsets {
    let insets = super.safeAreaInsets
    return UIEdgeInsets(top: insets.top, left: 0, bottom: 0, right: 0)
}
...