2015-04-21 6 views
8

Per UIWebView, possiamo ottenere altezza i contenuti di questo:Come calcolare l'altezza del contenuto di WKWebView?

[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] 

Ma WKWebView non ha questo metodo e webView.scrollView.contentSize.height non è giusto.

(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation 
    { 
    } 

Grazie per il vostro aiuto!

+0

WKWebView ha - evaluateJavaScript: completionHandler: invece . È il metodo UIWebView asincrono online. Dovrai modificare il tuo codice di conseguenza. – zambrey

+0

Ciao, trovi qualche soluzione per questo problema? Grazie, –

risposta

2

È possibile ottenere in questo modo:

self.webview.navigationDelegate = self; 

- (void)webView:(WKWebView *)webview didFinishNavigation:(WKNavigation *)navigation{ 
    // webview.scrollView.contentSize will equal {0,0} at this point so wait 
    [self checkIfWKWebViewReallyDidFinishLoading]; 
} 


- (void)checkIfWKWebViewReallyDidFinishLoading{ 
     _contentSize = _webview.scrollView.contentSize; 
     if (_contentSize.height == 0){ 
      [self performSelector:@selector(WKWebViewDidFinishLoading) withObject:nil afterDelay:0.01]; 
     } 
} 
8

ho risolto questo problema con KVO.

In primo luogo, per addObserver contentSize di ScrollView di WKWebView come questo:

addObserver(self, forKeyPath: "webView.scrollView.contentSize", options: .New, context: nil) 

E accanto, ricevono il cambiamento come questo:

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    if keyPath == "webView.scrollView.contentSize" { 
     if let nsSize = change[NSKeyValueChangeNewKey] as? NSValue { 
      let height = nsSize.CGSizeValue().height 
      // Do something here using content height. 
     } 
    } 
} 

E 'facile da ottenere l'altezza contenuti WebView.

Non dimenticare di togliere all'osservatore:

removeObserver(self, forKeyPath: "webView.scrollView.contentSize", context: nil) 

ho Worte questa linea in deinit.

+0

webView.addObserver (self, forKeyPath: "webView.scrollView.contentSize", opzioni: .Nuovo, il contesto: nil) addObserver: opzioni @ "webView.scrollView.contentSize": forKeyPath : 1 contesto: 0x0] è stato inviato a un oggetto che non è conforme a KVC per la proprietà "webView". – orazz

+1

@orazz funzionerà solo se il tuo controller di visualizzazione (self) ha la proprietà chiamata 'webView'. –

+1

Penso che funzioni solo se il contenuto della webView è più grande della webView. se il contenuto è più piccolo, ottieni la cornice della webView. Cercando di capire un buon modo per ridimensionare il webView per ottenere dimensioni appropriate. –

0

WKWebView didn't finish loading, when didFinishNavigation is called - Bug in WKWebView? WKWebView non utilizza la delega per avvisare quando il caricamento del contenuto è completo. È possibile creare un nuovo thread per verificare lo stato di WKWebView.

override func viewDidLoad() { 
    super.viewDidLoad() 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { 
     while(self.webView?.loading == true){ 
      sleep(1) 
     }    
     dispatch_async(dispatch_get_main_queue(), { 
      print(self.webView!.scrollView.contentSize.height) 
     }) 
    }) 
} 
+2

Spiega la tua risposta in modo un po 'più dettagliato perché possa essere utile a più persone che solo una copia -> incolla -> "funziona!" -> abbiamo finito qui! - stile. – thepio

2

EDIT:

per ottenere il miglior calcolo dell'altezza possibile, alla fine ho fatto un paio di cose per ottenere la migliore altezza:

  1. ho impostato la dimensione del WebView essere molto grande e quindi caricare il contenuto.
  2. Una volta caricato il contenuto (notifica KVO) Ridimensiono la vista utilizzando il metodo seguente.
  3. Quindi eseguo la funzione di dimensione di nuovo e ottengo una nuova dimensione e ridimensiono nuovamente la vista.

Quanto sopra ha ottenuto i risultati più accurati per me.

ORIGINALE:

Ho provato il KVO vista di scorrimento e ho provato valutando javascript sul documento, utilizzando clientHeight, offsetHeight, ecc ...

Quello che ha funzionato per me alla fine è : document.body.scrollHeight. Oppure usa scrollHeight del tuo elemento più in alto, ad es. un container div.

ascolto la loading WKWebview modifiche alle proprietà utilizzando KVO:

[webview addObserver: self forKeyPath: NSStringFromSelector(@selector(loading)) options: NSKeyValueObservingOptionNew context: nil]; 

E poi:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
    if(object == self.webview && [keyPath isEqualToString: NSStringFromSelector(@selector(loading))]) { 
     NSNumber *newValue = change[NSKeyValueChangeNewKey]; 
     if(![newValue boolValue]) { 
      [self updateWebviewFrame]; 
     } 
    } 
} 

Il updateWebviewFrame implementazione:

[self.webview evaluateJavaScript: @"document.body.scrollHeight" completionHandler: ^(id response, NSError *error) { 
    CGRect frame = self.webview.frame; 
    frame.size.height = [response floatValue]; 
    self.webview.frame = frame; 
}];