iPhone SDK:如何停止UIWebView加载/下载图片

6

我该如何在Xcode中使用UIWebView,以便在加载页面时不下载图像(从而获得更快的加载速度)?

4个回答

4

UIWebView是Webkit完整版WebView的弱化版本,因此解决这个问题相对较为困难。只有在导航时才会调用-webView:shouldStartLoadWithRequest:navigationType:,而不像Mac上的WebPolicyDelegate那样对每个请求都进行调用。对于UIWebView,我会采用以下方法解决这个问题:

实现-webView:shouldStartLoadWithRequest:navigationType:, 并将其设置为始终返回NO。但你还要获取请求并创建一个NSURLConnection。当NSURLConnection完成数据抓取后,你需要搜索其中的所有IMG标签,并将它们修改为所需的占位符。然后使用-loadHTMLString:baseURL:将结果字符串加载到UIWebView中。

当然,在iPhone上解析HTML并不是一项微不足道的任务,而且JavaScript加载器可能会给你带来麻烦,因此这并不是完美的答案,但这是我所知道的最好的方法。


1
扩展Rob的答案。 我注意到当loadHTMLString:baseURL:总是返回NO时,webView:shouldStartLoadWithRequest:navigationType:会一直被调用。(我怀疑loadHTMLString会调用另一个shouldStartLoadWithRequest)。
所以我不得不在YES/NO之间交替返回,并使用NSScanner解析HTML并将src="http://..."更改为src=""。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if (pageHasNoImages==YES)
    {
        pageHasNoImages=FALSE;
        return YES;     
    }
    NSString* newHtml;
    NSString* oldHtml;
    NSData *urlData;
    NSURLResponse *response;
    NSError *error;
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    oldHtml=[[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];

    newHtml=[self.detail scannerReplaceImg:oldHtml]; // my own function to parse HTML
    newHtml=[self.detail scannerReplaceAds:newHtml]; // my own function to parse HTML
    if (newHtml==nil) 
    {
        NSLog(@"newHtml is nil");
        newHtml=oldHtml;
    }
    [oldHtml release];

    pageHasNoImages=TRUE;
    [web loadHTMLString:newHtml baseURL:request.URL];

    return NO;
}

0
成为UIWebView的代理,然后拦截调用:
– webView:shouldStartLoadWithRequest:navigationType:

请查看文档中navigationType的值。我认为最好在navigationType == UIWebViewNavigationTypeOther时返回NO


webView:shouldStartLoadWithRequest:navigationType: 在下载完成后被调用。 - Harry

0

这样做实际上会加快页面加载吗? 听起来好像图片仍在下载,只是我们没有把它们提供给UIWebView。

或者shouldStartLoadWithRequest只是先加载HTML文本?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接