Web和本地页面同存在一个页面时的计算高度问题

最近做项目遇见一个情况,我想很多人都不想遇到

问题::页面上面是一个后台传入的HTML代码要用webView加载,然后紧接着下面是一个横向滑动的collectionView。

关键的点::上面的webView要根据加载的HTML代码计算出高度,然后重新改变页面的布局,

我的做法::

1刚开始的布局:页面是一个上放上一个scrollView,(因为webView高度很可能太大一个屏幕显示不下这样底下的collectionView就看不到了,所以页面大小要能改变),然后上面放上一个webView下面放上collectionView。

2获取HTML代码进行处理计算webView高度:这个部分大家上网找都会找到一个方法获取(在webView加载完成代理里面执行)

CGFloat scrollHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];

这个是调用HTML的方法得到HTML页面的高度,但是这个高度很可能是不准确的Ps:大多时候不准确,分析了很久发现不准确是因为,HTML页面的宽度是不对应的屏幕宽度的,所以我们要将返回的HTML代码进行处理使其适应屏幕的宽度这样得到的高度就是准确的了,具体做法如下

NSString * headStr = [NSString stringWithFormat:@"<div style=\"width:%f;height:auto;\">",[UIScreen mainScreen].bounds.size.width-10];

NSString * lineStr = @"</div>";                

NSString * htmlStr = [NSString stringWithFormat:@"%@%@%@",headStr,_brandModel.brand.content,lineStr];

具体意思是自己拼接一段HTML代码把整个页面变成一个div(盒子)然后设定div的宽度是你屏幕的宽度,高度自适应这样我们得到的HTML高度就是准确的了,

3.更新页面的布局:

CGFloat scrollHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];//得到webView高度

CGRect oldHeaderWenHeight = self.headWebView.frame;

oldHeaderWenHeight.size.height = scrollHeight;

self.headWebView.frame = oldHeaderWenHeight;//刷新webView高度


self.bgscrollView.contentSize = CGSizeMake(DEF_SCREEN_WIDTH, scrollHeight+itemHeight);//刷新scrollView高度


CGRect oldCollectionView = self.collectionView.frame;

oldCollectionView.origin.y = webViewHeight;

self.collectionView.frame = oldCollectionView;//刷新CollectionView高度

推荐阅读更多精彩内容