2015-05-01 49 views
6

我有一個包含WKWebView的混合iOS應用程序,並且我有一個JavaScript函數callNative可以在主線程中調用Objective C本機代碼。WKWebView在觸發本機代碼之前等待DOM渲染

在我的JavaScript,我有以下結構

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

出於某種原因,animateWKWebViewFrame(本機代碼)之前modifyDOM完成所謂並完全呈現。 (這會導致視覺故障。)

如何在調用本地代碼之前強制完成DOM修改的渲染?

+0

你能向我們展示了'modifyDOM()'方法的某些部分?你提到它不包含任何動畫 - 可能你錯了......你是否曾嘗試在'modifyDOM()'和'callNative'之間添加日誌或警報語句,並且可能在'modifyDOM( )'!? – luk2302

回答

0

如何使檢測modifyDOM()函數的另一個回調?

// 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]; 

一旦modifyDOM()函數執行完畢,你所說的「互操作」打電話回來,然後你可以回調啓動()與任何希望,並呼籲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

我不是100%確定你的方法有效。當你寫下「一旦你的modifyDOM()函數完成了......」,問題是JavaScript-land可能會認爲在實際渲染時,modifyDOM()已經完成執行。 – Randomblue

1

我假設你正在使用jQuery因爲你的評論說modifyDOM調用show()hide()。如果是這種情況,那麼您應該依靠complete參數來提供一個函數,該函數將依次調用您的本機代碼。

相關文件是在這裏:
http://api.jquery.com/hide/#hide-duration-complete
http://api.jquery.com/show/#show-duration-complete

最後,這裏是一些示例代碼:

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

動畫是即時的。他們應該立即完成。 – Randomblue

+0

然後,您可以在我提供的代碼示例中替換400的持續時間爲0,並試一試。如果它不能解決你的故障,那麼也許你可以提供更多關於發生的小故障的細節,以及你測量WebView框架動畫的方式。 – Dalzhim

+0

考慮到你沒有提供任何新信息來解決你的問題,這裏是另一個盲點。我猜測你的改變會影響你的內容的大小,並且你提取的測量結果會讓你的WebView框架動畫不對,因爲渲染沒有結束。如果是這樣,請確保使用getComputedStyle函數檢索內容的大小,如以下文檔所述:https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle – Dalzhim

相關問題