您的位置:首页 > 移动开发

隐藏TabBar后,UIWebView加载过程中和加载失败时,底部出现黑边的问题解决

2013-06-13 16:17 423 查看
描述

我的应用里同时使用了 TabBar 和 Navigation Bar,由于原本的 TabBar 不能满足我的外观效果要求,我用自定义的 view 实现了一个 TabBar 的外观,隐藏了原本的 TabBar,切换视图的功能还是调用原来 TabBar 的接口。不知道是不是因为自定义TabBar的原因,当通过导航控制器进入第二个视图,并在第二个视图中隐藏TabBar时会出现一些问题,我的第二个视图是一个WebView,打开一个网页,如果网页加载较慢或者未加载到内容时,底部原来的TabBar位置是一块黑色区域,感觉上是那块区域没有被WebView利用到。如果页面加载成功那个黑色区域就会被WebView利用到。

原因

我猜想,可能是因为隐藏TabBar后,WebView并没有及时重新绘制视图,只有当其加载页面完成后才去更新。因此我的解决方案是做了一个空白的html页面(html结构完整,只是body为空白)放到工程中,WebView在加载在线数据之前先加载本地的空白html页面,在线数据加载失败时也加载一次空白html页面,这就相当于我们主动要求WebView去重新绘制视图。不知道我的猜想是否正确,不过用这个方案确实完美解决了黑边的问题。

主要代码

空白html页面内容,文件名为load_error.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>


加载本地html文件的方法

//加载本地的一个空html页面,解决webview没有加载完网页,底部留下tabbar黑色区域的问题
- (void)loadBlankPage {
if (!errorRequest) {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"load_error" ofType:@"html"];
NSURL *errorUrl = [NSURL fileURLWithPath:filePath];
errorRequest = [NSURLRequest requestWithURL:errorUrl];
}
[self.webView loadRequest:errorRequest];
}
说明:其中errorRequest是自己的一个成员变量。

加载在线数据的逻辑

[self loadBlankPage];
[self performSelector:@selector(loadPage) withObject:nil afterDelay:0.5f];
说明:这里的loadPage方法是自定义的加载在线网页的方法,加载在线页面紧接在加载空白html页面之后,做了0.5秒延迟的原因是保证本地html页面加载完成,否则会收到错误代码为-999的加载错误,表示加载未完成,被中断。这也说明WebView的 loadRequest: 方法是异步的。

加载错误的处理逻辑

- (void)webView:(UIWebView *)sender didFailLoadWithError:(NSError *)error {
NSLog(@"error:%@", [error description]);
//为了避免加载空白页面中断进入死循环
if (error.code != -999) {
[self loadBlankPage];
}
}
说明:这里不处理 -999的错误是为了防止进入死循环。其他错误情况会去加载空白的html页面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐