强制UIWebView重绘?

时间:2013-06-23 04:06:03

标签: ios objective-c

是否有任何技术可以让UIWebView重绘自己?我在UIWebView及其UIScrollView上尝试了setNeedsDisplaysetNeedsLayout,但都没有用过。

2 个答案:

答案 0 :(得分:9)

在询问后立即找到答案。关键是告诉UIWebView 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的类名而不改变。没有它,它会击中滚动视图中的所有UIViews,这在这一点上并不是真正的问题(不会产生重大的开销),但总是可以改变。

修改

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

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

您认为UIScrollView的{​​{1}}也会这样做,但根据我的经验并非总是如此 - 由于某种原因contentOffset在这方面很特别。

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

答案 1 :(得分:0)

这拯救了我的生命:

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

在webview上添加此行,加载委托事件或wkwebview确实完成导航

谢谢MAN !!!!