5

是否有任何技术可以导致 UIWebView 重绘自身?我已经尝试过UIWebViewsetNeedsDisplay及其setNeedsLayoutUIScrollView,但都没有奏效。

4

2 回答 2

9

一问就直接找到了答案。关键是告诉UIWebView's的子视图scrollView重绘自己——尤其是UIWebBrowserView.

- (void) forceRedrawInWebView:(UIWebView*)webView {
    NSArray *views = webView.scrollView.subviews;

    for(int i = 0; i<views.count; i++){
        UIView *view = views[i];

        //if([NSStringFromClass([view class]) isEqualToString:@"UIWebBrowserView"]){
            [view setNeedsDisplayInRect:webView.bounds]; // Webkit Repaint, usually fast
            [view setNeedsLayout]; // Webkit Relayout (slower than repaint)

            // Causes redraw & relayout of *entire* UIWebView, onscreen and off, usually intensive
            [view setNeedsDisplay]; 
            [view setNeedsLayout];
            // break; // glass in case of if statement (thanks Jake)
        //}
    }
}

我已将 if 语句注释掉以确保安全并避免依赖UIWebBrowserView' 的类名不会更改。没有它,它会命中滚动视图中的所有 UIView,这在这一点上并不是真正的问题(不会产生重大开销),但总是可以改变。

编辑:

在某些情况下,以下 JavaScript 片段将完成相同/相似的事情:

window.scrollBy(1, 1); window.scrollBy(-1, -1);

您可能会认为UIScrollView'scontentOffset也会这样做,但根据我的经验,情况并非总是如此 - 由于某种原因window.scrollTo在这方面很特别。

要点:https ://gist.github.com/matt-curtis/5843862

于 2013-06-23T04:10:19.067 回答
0

这救了我的命:

self.wkWebView.evaluateJavaScript("window.scrollBy(1, 1);window.scrollBy(-1, -1);", completionHandler: nil)

在 webview 上添加这一行确实加载了委托事件或 wkwebview 确实完成了导航

谢啦!!!!

于 2017-01-22T07:33:16.907 回答