WKWebView не перенаправляет контент при загрузке другого URL-адреса

В настоящее время я разрабатываю приложение, которое использует UIWebView для отображения некоторого контента. Он отлично работал с UIWebView , но мы решили переключиться на WKWebView когда мы повысили требования к ОС до 8.1. Мы заметили огромное улучшение производительности, но некоторые простые мысли, которые привыкли работать нормально, начали сбой сейчас. После некоторых исследований мне удалось понять, что происходит, но я не понимаю, как это исправить. Мне было интересно, может ли кто-нибудь помочь мне в этом …

URL-адрес наших загрузок webview занимает довольно много времени, чтобы закончить работу, поэтому перед запуском запроса мы загружаем статический счетчик, чтобы пользователь не чувствовал, что приложение сошло с ума. Цикл загрузки для этого статического содержимого уже настроен, поэтому мы не запускаем URL-запрос до тех пор, пока не будет загружен статический контент. Это прекрасно работает, если пользователь не поворачивает устройство. Вот что можно увидеть:

(Мне пришлось изменить представление для целей конфиденциальности. Я не являюсь владельцем этого кода, в конце концов :-))

введите описание изображения здесь

Я использую этот HTML-код для проверки размера. Цвет фона тела темно-серый, а уродливая светло-серая коробка расширяется до 100% ширины, вычитая края. Все идет нормально. Но если пользователь поворачивает устройство, это происходит:

введите описание изображения здесь

Это жутко, поскольку, по-видимому, строение тела соответствует максимальной ширине, но внутренний div обрабатывает неправильный относительный размер. Это продолжается до тех пор, пока запрос обрабатывается. Когда я заставляю тайм-аут сделать запрос неудачным, WKWebView повторно отображает и показывает его правильный внешний вид:

введите описание изображения здесь

Как только я это обнаружил, я безуспешно пытался подписаться на наблюдателя ротации и повторно перенаправить на веб-просмотр:

  • Вызов viewNeedsDisplay для UIWebView и UIScrollView внутри
  • Изменение размера UIWebView
  • Повторное позиционирование содержимого UIScrollView

Итак, мои выводы до сих пор:

  • Это не произошло в UIWebView , только на новом WKWebView (я снова это подтвердил, подтвердил)
  • Похож, что WKWebView не визуализирует представления правильно, пока он находится на статусе загрузки

Кто-нибудь знает, есть ли способ исправить это? Что-то вроде одного магического свойства, которое я пропускаю, по умолчанию отключено? Я не хочу думать, что они сломали эту часть, когда они переделали веб-просмотр … Спасибо заранее 🙂

Edit: Stuff Я пытался с момента создания сообщения, без успеха:

  • Изменение асинхронно DOM с помощью обратных вызовов javascript / native вращения не работает . Изменения не будут отображаться до завершения HTTP-запроса.
  • Вызов HTTP-запроса в другом потоке с использованием метода dispatch_async не работает . Под капотом WKWebview вероятно, заканчивается тем же потоком, что и если вы вызываете его из основного потока.

Если вы не против немного взломать, есть способы сделать это с помощью Javascript:

  1. Вы можете добавить Javascript, который обнаруживает изменения, такие как window.orientation и window.onresize . Посмотрите, вызвано ли какое-либо событие, связанное с кадром. Если они вызываются, просто измените размер div на Javascript.

  2. Если события никогда не срабатывают, вы можете подделать их самостоятельно, используя оценкуJavaScript: completeHandler:

  3. Вы также можете сделать свои собственные события таким образом. Просто отправьте файл resize div каждый раз, когда вы обнаружите изменение ориентации устройства в своем приложении.

  4. Если вы загружаете Javascript, вы можете посмотреть async и defer <script> . Это означает, что вам придется изменить код в веб-просмотре.

Это не лучший способ приблизиться к этому, но для этого потребуется минимальное изменение.

Я также предлагаю вам заполнить отчет об ошибке на странице https://bugreport.apple.com/ , чтобы вы знали, является ли это ожидаемым поведением или нет.

Хотя у меня нет решения для WKWebView не рендеринга при загрузке контента, я бы предложил другое решение вашей проблемы.

Вы можете изменить вид загрузки со страницы, загруженной в веб-просмотр, на собственное представление iOS. Просто добавьте subview к основному виду, над веб-представлением, когда вы начнете загружать и удалять его при завершении загрузки. Это будет отлично работать с вращением, и вы можете иметь тот же опыт, что и раньше.

Другим решением было бы загрузить ваше загрузочное представление в UIWebView как это было раньше, до того, как это будет отлично с вращением и нормальной страницей в WKWebView позади него. Когда страница загружается, вы также просто скрываете или удаляете UIWebView .

  • Как получить AVPlayer на веб-странице с помощью WKWebView в swift?
  • Поддерживает ли webKit в iOS 11 (бета) поддержку WebRTC?
  • Видеокамера видео камеры устройства iOS на локальную страницу html в wkwebview
  • WKWebView зависает при загрузке локальной веб-страницы с определенной настройкой сети.
  • Состояние WKWebView на Кордове iOS 9?
  • SWIFT - события прокрутки HTML в WKWebView, находящиеся внутри ScrollView
  • WKWebView отображает контент неправильно после изменения ориентации
  • WKWebView, отображающий пустоту на устройстве, работающий на симуляторе
  • Запрос разрешения для камеры и библиотеки в iOS 10 - Info.plist
  • WKProcessPool можно хранить на постоянной основе с помощью NSUserDefaults или что-то еще?
  • WKSelectionGranularityCharacter опция WKWebView, поврежденная в iOS 9
  • Interesting Posts

    Crash on collectionView.performBatchUpdates при попытке скрыть нижний колонтитул / заголовок

    Как сделать вид прокрутки? Так же, как профиль Instagram

    Создайте iOS-библиотеку с помощью Bitcode, чтобы иметь обратную совместимость с XCode 6. Как?

    Обрабатывать URL-адрес http с моим приложением (если установлено)

    Большой симулятор iPhone 5?

    Обновление приложения по-прежнему указывает на старые удаленные наконечники. Как решить эту проблему без повторной установки приложения?

    Добавление изображения в UIAlertController

    Swift – self.navigationController становится nil после перехода

    Получение предупреждения, когда я открыл свой проект xcode 4.5 в xcode 5

    iOS – WatchKit, как отправить сообщение / данные из приложения iPhone в приложение WatchKit?

    SPTPlaylistSnapshot tracksForPlayback возвращает nil

    Можно ли использовать NSBinaryStoreType для этой модели данных?

    AVAssetWriterInput H.264 Passthrough to QuickTime (.mov) – Передача в SPS / PPS для создания атома avcC?

    Почему UICollectionViewCells перестает быть видимым после назначения UICollectionViewLayout в UICollectionView?

    Как создать функцию, которая в конечном итоге вернет некоторые данные, а вызывающий должен подождать

    Давайте будем гением компьютера.