2015-05-01 2 views
6

Ich habe eine hybride iOS-App, die eine WKWebView enthält, und ich habe eine JavaScript-Funktion callNative kann Objective C nativen Code im Hauptthread aufrufen.WKWebView warten auf DOM-Rendering vor dem Auslösen von nativen Code

In meinem JavaScript, ich habe die folgende Struktur

modifyDOM(); // e.g. .show(), and .hide() stuff 
callNative('animateWKWebViewFrame'); 

Aus irgendeinem Grund wird animateWKWebViewFrame (native code) vormodifyDOM abgeschlossen ist genannt und vollständig wiedergegeben wird. (Dies verursacht einen visuellen Fehler.)

Wie kann ich das vollständige Rendering von DOM-Modifikationen vor dem Aufruf von systemeigenem Code erzwingen?

+0

Können Sie uns zeigen, ein Teil der 'modifyDOM()' Methode? Sie erwähnen, dass es keine Animationen enthält - vielleicht irren Sie sich ... haben Sie versucht, Log- oder Alert-Anweisungen zwischen 'modifyDOM()' und 'callNative' hinzuzufügen und vielleicht am Ende der eigentlichen Implementierung von' modifyDOM () '!? – luk2302

Antwort

0

Wie wäre es mit einem anderen Rückruf für die Erkennung modifyDOM() -Funktion?

// alloc webview 
    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
    [theConfiguration.userContentController addScriptMessageHandler:self name:@"interOp"]; 
    self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) configuration:theConfiguration]; 

Sobald Ihr modifyDOM() Funktion ist abgeschlossen Sie „Interop“ Rückruf aufrufen und dann können Sie Rückruf initiieren() mit dem, was wollen und rufen animateWKWebViewFrame

- (void)userContentController:(WKUserContentController *)userContentController 
     didReceiveScriptMessage:(WKScriptMessage *)message { 

    NSDictionary *sentData = (NSDictionary*)message.body; 
    NSString* command = sentData[@"command"]; 

    LOG(@"[userContentController] command(%@)", command); 

    if ([command isEqualToString:@"DOMReady"]) { 
     // defining a JavaScript function 
     NSString *jsFunctionText = @"Initiate({" 
            "command:animateWKWebViewFrame" 
            "});"; 
     [self.webView evaluateJavaScript:jsFunctionText completionHandler:^(id object, NSError * err) { 
      if (err) { 
       LOG(@"[evaluateJavaScript] error(%@)", err); 
      } 
     }]; 
    } 
+0

Ich bin nicht 100% sicher, dass Ihre Methode funktioniert. Wenn Sie schreiben "Sobald Ihre modifyDOM() Funktion beendet ist ...", das Problem ist, dass JavaScript-Land denken könnte, dass 'modifyDOM()' fertig ausgeführt wird, wenn tatsächlich in Rendering-Land Zeug noch in der Pipeline ist. – Randomblue

1

Ich gehe davon aus, dass Sie verwenden jQuery wegen Ihres Kommentars sagen modifyDOM Anrufe show() und hide(). Wenn dies der Fall ist, sollten Sie sich auf den Parameter complete verlassen, um eine Funktion bereitzustellen, die wiederum den Aufruf Ihres systemeigenen Codes aufruft.

Die entsprechende Dokumentation ist hier:
http://api.jquery.com/hide/#hide-duration-complete
http://api.jquery.com/show/#show-duration-complete

Und schließlich, hier einige Codebeispiel:

function modifyDOM() 
{ 
    someElement.show(400, function() {callNative('animateWKWebViewFrame');}); 
} 
+0

Animationen sind sofort. Sie sollten sofort abgeschlossen werden. – Randomblue

+0

Dann können Sie die Dauer von 400 durch 0 in der bereitgestellten Codebeispiel ersetzen und es versuchen. Wenn es Ihren Glitch nicht löst, könnten Sie vielleicht mehr Details über den auftretenden Glitch und die Art, wie Sie die Messungen durchführen, um den WebView-Frame zu animieren, bereitstellen. – Dalzhim

+0

In Anbetracht der Tatsache, dass Sie keine neuen Informationen bereitstellen, um Ihr Problem zu lösen, hier ist ein weiterer Blindversuch. Ich nehme an, dass Ihre Änderungen sich auf die Größe Ihres Inhalts auswirken und dass die Messungen, die Sie extrahieren, um den Frame Ihres WebView zu animieren, falsch sind, weil das Rendering nicht vorüber ist. Wenn dies der Fall ist, stellen Sie sicher, dass Sie die Größe des Inhalts mithilfe der getComputedStyle-Funktion abrufen, wie hier dokumentiert: https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle – Dalzhim

Verwandte Themen