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

在应用中自定义TabBar并隐藏原生TabBar后,当进入一个使用UIWebView的视图并隐藏TabBar,若网页加载缓慢或失败,底部会出现黑色区域。问题可能因WebView未及时重绘视图。通过预加载本地空白html页面,确保WebView在加载在线内容前后都有一次重绘,从而消除黑边问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

我的应用里同时使用了 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页面。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值