乐虎游戏|乐虎国际登录|欢迎你

IOS TableViewCell嵌套webview

日期:2020-04-05编辑作者:计算机资讯

图片 1IMG_0521.JPG

我们开发中,在使用UITableView的时候经常会遇到这样的需求:table view的cell中的内容是动态的。于是我们就在table view的代理中手动去计算cell中的内容高度。这样做有两个问题:

花时间写了个Demo,包含比较全面从UIView,UILabel,UIImageView的自适应到UITextView,UITableView,UICollectionView,UIScrollView都有,可以下载学习一下。Demo地址
注意不配合demo也许会不知所云!

新项目中,遇到了一个新的需求:tableview中一个cell里嵌套了web view,想让web view根据内容自适应高度,cell根据webView自适应高度。对于这个需求,我们只要2步就可以完成。

  1. 计算代码冗长、复杂。
  2. 每次 reload tableview 的时候,系统会先计算出每一个 cell 的高度,等所有高度计算完毕,确定了 tableview 的contentSize后,才开始渲染视图并显示在屏幕上。如果数据比较多,就会感受到非常明显的卡顿。

图片 2

webview的高度,我从

所以,我们应该寻找其他的解决方案。如果你的项目只支持iOS8及以上,那么恭喜你,你只用简单的几步就可以实现自适应cell了。如果是iOS7也没关系,后面我也会讲到,如何在iOS下实现自适应cell。

autolayoutdemo.gif

 //获取到webview的高度 CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];

- viewDidLoad { [super viewDidLoad]; _webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, 1)]; _webView.delegate = self; _webView.scrollView.scrollEnabled = NO; //预先加载url [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.baidu.com/"]]];}- didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}#pragma mark - TableViewDelegate & TableViewDatasource- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return 3;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == 1){ static NSString *identifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; [cell.contentView addSubview:_webView]; /* 忽略点击效果 */ [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; } return cell; }else{ static NSString *identifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } cell.textLabel.text = [NSString stringWithFormat:@"index====%ld",indexPath.row]; return cell; } }- tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;{ if(indexPath.row == 1){ /* 通过webview代理获取到内容高度后,将内容高度设置为cell的高 */ return _webView.frame.size.height; }else{ return 100; }}- tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [tableView deselectRowAtIndexPath:indexPath animated:YES];}#pragma mark - UIWebView Delegate Methods-webViewDidFinishLoad:(UIWebView *)webView{ //获取到webview的高度 CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]; self.webView.frame = CGRectMake(self.webView.frame.origin.x,self.webView.frame.origin.y, kScreenWidth, height); [self.tableView reloadData];}- webViewDidStartLoad:(UIWebView *)webView{ NSLog(@"webViewDidStartLoad");}- webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{ NSLog(@"didFailLoadWithError===%@", error);}

在讲具体的实现之前,必须得说一下iOS7中新增的一个API:

iOS8之后 使用AutoLayout是非常方便的,更何况iOS11都要发布了,不会还想着支持iOS7吧!(iOS7也是支持autolayout的,只是有一些坑及与iOS8API的不同)。

图片 3效果图

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;

iOS8以后,对于UIScrollView及UITableView,UICollectionViewCell的高度自适应解决了我们一直头疼的变高问题!!!

本文由乐虎游戏发布于计算机资讯,转载请注明出处:IOS TableViewCell嵌套webview

关键词:

乐虎国际登录iOS之Pod install VS Pod update

乐虎国际登录,此文为翻译文章,原文网址: 简介 大多数人使用CocoaPods的时候都会想当然的以为podinstall仅仅在第一...

详细>>

iOS 用RunTime重写KVO<附德姆o>

3.在第二步之后,我点击一个button ,push 到另外一个ViewController(TestViewController)里面,然后在TestViewController里面,点击...

详细>>

乐虎国际登录四十二十四线程与NSTimer

NSInteger转 Byte 数组,长度为2 1.Ios主线程,也称UI线程,在主线程中使用NSTimer,runloop是自动开启的,(如果NSTimer当前所...

详细>>

3D touch

Peek and Pop peek能够让客商在不离开当前内容的前提下预览贰个item和进行有关的actions,不过前提是item要求扶持当响应叁...

详细>>