html webview 自适应大小,ios webview自适应实际内容高度5种方法

本文介绍了五种不同的方法来确保UIWebView的内容高度自适应,包括通过内容Size、JavaScript交互、sizeThatFits方法、遍历子视图以及KVO观察。在复杂的网页结构和延迟加载内容的情况下,这些方法可能需要结合使用以获得准确的高度。作者推荐使用前两种方法,并提到了在某些情况下可能需要监听加载进度以获取最终内容高度。
摘要由CSDN通过智能技术生成

有的时候会碰见类似的苦逼需求, 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));

}];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值