2015-05-04 16 views
11

Attualmente sto sviluppando un'applicazione che utilizza uno UIWebView per visualizzare alcuni contenuti. Funzionava perfettamente con UIWebView, ma abbiamo deciso di passare a WKWebView quando abbiamo aumentato il requisito del sistema operativo a 8.1. Abbiamo notato un enorme miglioramento delle prestazioni, ma alcuni semplici pensano che funzionassero bene, iniziando a fallire ora. Dopo alcune ricerche, sono riuscito a vedere cosa sta succedendo, ma non vedo come risolverlo. Mi chiedevo se qualcuno potesse darmi una mano su questo ...WKWebView non esegue il re-rendering del contenuto durante il caricamento di un altro URL

L'URL che la nostra pagina web carica impiega un bel po 'di tempo per completare il lavoro, quindi prima di iniziare la richiesta carichiamo uno spinner statico quindi l'utente non lo fa Mi sento come se l'app fosse impazzita. Il ciclo di caricamento per quel contenuto statico è già stato regolato, quindi non iniziamo la richiesta URL finché il contenuto statico non è stato caricato correttamente. Funziona bene, a patto che l'utente non ruoti il ​​dispositivo. Questo è ciò che può essere visto:

(ho dovuto cambiare la visualizzazione per ragioni di privacy non sono il proprietario di questo codice, dopo tutto :-).)

enter image description here

Sono usando questo codice html per testare la dimensione. Il colore di sfondo del corpo è grigio scuro, e il brutto riquadro grigio chiaro si espande al 100% della larghezza, sottraendo i margini. Fin qui tutto bene. Ma se l'utente ruota il dispositivo, questo è ciò che accade:

enter image description here

Questo è da brividi, dal momento che a quanto pare stetching del corpo in modo che corrisponda alla larghezza massima, ma il div interno sta gestendo una dimensione relativa sbagliata. Questo continua finché la richiesta è in elaborazione. Quando forzo un timeout per effettuare la richiesta sicuro, il WKWebView ri-rendering e mostra il suo aspetto corretto:

enter image description here

volta ho scoperto questo ho cercato, senza successo, abbonarsi alla rotazione osservatore e forza ri -renders sul WebView per:

  • Calling viewNeedsDisplay sia per il UIWebView e UIScrollView all'interno
  • Ri-dimensionamento della UIWebView
  • Per spostare il contenuto UIScrollView

Quindi, le mie conclusioni finora:

  • questo non è accaduto su un UIWebView, proprio sulla nuova WKWebView (ho provato di nuovo questo, confermato)
  • Sembra WKWebView non viene visualizzata correttamente viste mentre è in stato di caricamento

Vuol somebod sai se c'è un modo per risolvere questo problema? Qualcosa come una proprietà magica che mi manca è disabilitata di default? Non voglio pensare che abbiano rotto questa parte quando hanno rifatto il webview ...Grazie in anticipo :)

Modifica: Stuff ho provato dal momento che la creazione della carica, senza successo:

  • Modifica del DOM asyncronally, attraverso l'utilizzo di JavaScript/callback rotazione nativi non lo fa lavoro. Le modifiche non vengono visualizzate finché la richiesta http non termina.
  • Chiamare la richiesta http in una thread diversa utilizzando il metodo dispatch_asyncnon funziona. Sotto il cofano, lo WKWebview probabilmente finisce per usare lo stesso thread come se lo chiamassi dal thread principale.
+0

Prova ad aggiornare manualmente la pagina con un cambio di orientamento? Non conosco il codice esatto che useresti – DDPWNAGE

+0

Non posso farlo. Dopo tutto, se non hai perso il punto della spiegazione, questo problema si verifica quando ti aspetti una risposta da un'altra richiesta, quindi se aggiorno la pagina che lancia una nuova richiesta, scartando quella vecchia ... e bloccando l'app;) – Bartserk

+1

Lo hai mai capito? Penso che mi stia imbattendo in un problema simile che si muove attorno a una WKWebview in cui è presente del video. – raphael

risposta

0

Mentre non ho una soluzione per il rendering di WKWebView durante il caricamento del contenuto, vorrei suggerire una diversa soluzione al problema.

È possibile modificare la vista di caricamento da una pagina caricata nella visualizzazione Web in una visualizzazione iOS nativa. Aggiungi una sottoview alla vista principale, sopra la webview quando inizi a caricarla e rimuovila quando il caricamento è terminato. Questo funzionerebbe bene con la rotazione e così puoi avere la stessa esperienza che avevi prima.

Un'altra soluzione sarebbe quella di caricare la vista di caricamento in un UIWebView come prima, che funziona bene con la rotazione e la pagina normale nel WKWebView dietro di esso. Quando la pagina viene caricata, ti basta anche nascondere o rimuovere lo UIWebView.

+0

Grazie per la tua risposta. Abbiamo pensato di passare a una visualizzazione nativa, ma è difficile da integrare nel nostro codice a causa della nostra particolare struttura, quindi temo che ricorro a questo solo se non c'è altro modo ... vedo – Bartserk

+0

Bene, puoi sempre usare la seconda soluzione, aggiungere un 'UIWebView' che sai funzionare, come una sottoview, e quindi rimuoverlo quando il caricamento è terminato – pteofil

+0

Sì, questo è quello che intendevo: il problema è come l'aggiunta/rimozione nativa dell'UIWebView influisce sul flusso corrente :) – Bartserk

2

Se non ti dispiace diventando un po 'hacky, ci sono modi per farlo con JavaScript:

  1. Si potrebbe aggiungere Javascript che rileva le modifiche, come window.orientation e window.onresize. Vedi se viene chiamato un evento relativo al frame. Se vengono chiamati, ridimensiona semplicemente il div te stesso con Javascript.

  2. Se gli eventi non vengono licenziati, si può fingere da soli utilizzando evaluateJavaScript:completionHandler:

  3. Si potrebbe anche fare la sua manifestazione in quel modo. È sufficiente inviare uno script div ridimensionare ogni volta che si rileva una modifica nell'orientamento del dispositivo all'interno della propria app.

  4. Se si sta caricando Javascript, è possibile esaminare async e defer del tag <script>. Ciò significa che dovrai modificare il codice nella visualizzazione web.

Non è il modo migliore per avvicinarsi a questo, ma richiederà il minimo cambiamento.

Suggerisco anche di compilare una segnalazione di bug al https://bugreport.apple.com/, in modo da poter sapere se si tratta di un comportamento previsto o meno.

+0

Non so se funzionerà, perché penso che il problema sia legato al thread dell'interfaccia utente che viene bloccato da la richiesta HTTP in arrivo. Ricordo di aver provato a modificare il DOM in modo asincronico con la console di sviluppo di Safari, e non ha iniziato a mostrare le modifiche fino a quando la richiesta non ha terminato il caricamento, quindi ... Non penso che aggiungere eventi farà la differenza. In effetti, non so se sarò in grado di posizionare quella vista manualmente, ma proverò comunque :) Grazie per la tua visione. – Bartserk