有的时候会碰见类似的苦逼需求, webview自适应实际内容高度 下面有四种方法供使用
方法1 获取webview中scrovllview的contentsize进行设置
Objective-C
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGFloat webViewHeight=[webView.scrollView contentSize].height;
CGRect newFrame = webView.frame;
newFrame.size.height = webViewHeight;
webView.frame = newFrame;
}
1
2
3
4
5
6
-(void)webViewDidFinishLoad:(UIWebView*)webView{
CGFloatwebViewHeight=[webView.scrollViewcontentSize].height;
CGRectnewFrame=webView.frame;
newFrame.size.height=webViewHeight;
webView.frame=newFrame;
}
方法2 执行js语句 直接获取html文档的dom高度
Objective-C
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGFloat webViewHeight= [[webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"]floatValue];
// CGFloat webViewHeight= [[webView stringByEvaluatingJavaScriptFromString: @"document.body.scrollHeight"]floatValue];
CGRect newFrame = webView.frame;
newFrame.size.height = webViewHeight;
webView.frame = newFrame;
}
1
2
3
4
5
6
7
-(void)webViewDidFinishLoad:(UIWebView*)webView{
CGFloatwebViewHeight=[[webViewstringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"]floatValue];
// CGFloat webViewHeight= [[webView stringByEvaluatingJavaScriptFromString: @"document.body.scrollHeight"]floatValue];
CGRectnewFrame=webView.frame;
newFrame.size.height=webViewHeight;
webView.frame=newFrame;
}
方法3. 先将UIWebView的高度设为最小,然后再使用sizeThatFits就会返回刚好合适的大小
Objective-C
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGSize actualSize = [webView sizeThatFits:CGSizeZero];
CGRect newFrame = webView.frame;
newFrame.size.height = actualSize.height;
webView.frame = newFrame;
}
1
2
3
4
5
6
-(void)webViewDidFinishLoad:(UIWebView*)webView{
CGSizeactualSize=[webViewsizeThatFits:CGSizeZero];
CGRectnewFrame=webView.frame;
newFrame.size.height=actualSize.height;
webView.frame=newFrame;
}
方法4.遍历webview子视图 获取UIWebDocumentView高度即实际高度
Objective-C
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGFloat webViewHeight = 0.0f;
if ([webView.subviews count] > 0)
{
UIView *scrollerView = webView.subviews[0];
if ([scrollerView.subviews count] > 0)
{
UIView *webDocView = scrollerView.subviews.lastObject;
if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
{
webViewHeight = webDocView.frame.size.height;//获取文档的高度
webView.frame= webDocView.frame; //更新UIWebView 的高度
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-(void)webViewDidFinishLoad:(UIWebView*)webView{
CGFloatwebViewHeight=0.0f;
if([webView.subviewscount]>0)
{
UIView*scrollerView=webView.subviews[0];
if([scrollerView.subviewscount]>0)
{
UIView*webDocView=scrollerView.subviews.lastObject;
if([webDocViewisKindOfClass:[NSClassFromString(@"UIWebDocumentView")class]])
{
webViewHeight=webDocView.frame.size.height;//获取文档的高度
webView.frame=webDocView.frame;//更新UIWebView 的高度
}
}
}
}
方法5.KVO,监听webView的scrollView的contentSize
比前四种更精确一步
Objective-C
[webview.scrollView addObserver:self forKeyPath:@"contentsize" options:NSKeyValueObservingOptionNew context:nil];
1
[webview.scrollViewaddObserver:selfforKeyPath:@"contentsize"options:NSKeyValueObservingOptionNewcontext:nil];
Objective-C
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
CGSize actualSize = [webView sizeThatFits:CGSizeZero];
}
}
1
2
3
4
5
-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context{
if([keyPathisEqualToString:@"contentSize"]){
CGSizeactualSize=[webViewsizeThatFits:CGSizeZero];
}
}
个人喜欢使用前两种方法
有些时候以上5种方法获取的高度都不是内容的高度,这是因为有很多web页面中有大量的css,js(js有时还会不同时机改变的html dom),使webViewDidFinishLoad不能完全监听到webview加载完成,也会使html标签的高度改变。
Objective-C
[self.webView setJk_webViewLoadChangeBlock:^(UIWebView *webView, float progress,CGSize contentSize) {
///complete的是时候contentSize是最后的准确size
if(webView.jk_readyState == JKReadyState_complete){
NSLog(@"load done");
NSLog(@"full contentSize:%@",NSStringFromCGSize(contentSize));
}
NSLog(@"jk progresss:%lf",progress);
NSLog(@"jk contentSize:%@",NSStringFromCGSize(contentSize));
}];
1
2
3
4
5
6
7
8
9
[self.webViewsetJk_webViewLoadChangeBlock:^(UIWebView*webView,floatprogress,CGSizecontentSize){
///complete的是时候contentSize是最后的准确size
if(webView.jk_readyState==JKReadyState_complete){
NSLog(@"load done");
NSLog(@"full contentSize:%@",NSStringFromCGSize(contentSize));
}
NSLog(@"jk progresss:%lf",progress);
NSLog(@"jk contentSize:%@",NSStringFromCGSize(contentSize));
}];