更新
2018年05月22日
陆续有用户反映有一些文章无法查看。调试(XCode9.3 (9E145))发现:在浏览多图文章时报以下问题:
- 报内存不足问题。
下面是修改内容:
- 删除以前的方法,WKWebView直接添加到cell的contentView里面
// [self.contentScrollView addSubview:self.webView];
// [self.contentView addSubview:self.contentScrollView];
[self.contentView addSubview:self.webView];
复制代码
- 更新高度方法修改,使用此方法可以只修改cell高度
[self beginUpdates];
[self endUpdates];
复制代码
背景
因项目需要,需要在UITableView中加入HTML与评论功能。下面作为此次爬坑的一次记录。):
总结
- UITableView与WKWebView的结合与适配,关键在于要先将WKWebView装进UIScrollview后再放进UITableViewCell里面去。
- 获取WKWebView的正确高度,放到网页加载完成的代理方法里面,使用js获取。
初始化
#import <WebKit/WebKit.h>
#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kScreenH [UIScreen mainScreen].bounds.size.height
static CGFloat MARGIN = 24;
@property(strong, nonatomic)UIScrollView *contentScrollView;
@property(strong, nonatomic)WKWebView *wkWebView;
-(WKWebView *)wkWebView{
if (!_wkWebView) {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
config.allowsInlineMediaPlayback = YES;//使用H5播放视频
_wkWebView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, kScreenW, 0) configuration:config];
_wkWebView.navigationDelegate=self;
_wkWebView.scrollView.scrollEnabled=NO;//禁止滚动,防止与UITableView冲突
}
return _wkWebView;
}
-(UIScrollView *)contentScrollView{
if (!_contentScrollView) {
_contentScrollView = [[UIScrollView alloc]init];
_contentScrollView.contentSize=CGSizeMake(kScreenW, kScreenH);
_contentScrollView.scrollEnabled=NO;//禁止滚动,防止与UITableView冲突
}
return _contentScrollView;
}
/**
初始化WKWebView
*/
-(void)initWebView{
[self.view addSubview:self.wkWebView];//需要先将WKWebView加入到view中
NSString *urlString =@"测试地址";
NSURLRequest *urlRequest = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:urlString] ;
[self.wkWebView loadRequest:urlRequest];
}
复制代码
WKWebView放进UITableViewCell的正确打开方式
解决:WKWebView无法显示完全问题
先将WKWebView放进UIScrollview,再把Scrollview放进Cell。
/**
WKWebView cell
@return cell
*/
-(UITableViewCell *)wkWebViewCell{
UITableViewCell *cell = [[UITableViewCell alloc]init];
cell.selectionStyle=UITableViewCellSelectionStyleNone;
//解决WKWebView无法显示完全问题。先添加到scrollview
self.contentScrollView.frame = self.wkWebView.bounds;
[self.contentScrollView addSubview:self.wkWebView];
[cell.contentView addSubview:self.contentScrollView];
return cell;
}
复制代码
如何正确获取WKWebView高度
实现WKNavigationDelegate代理方法以获取HTML高度
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
//获取网页正文全文高,刷新cell
[webView evaluateJavaScript:@"document.body.scrollHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
self.wkWebView.frame=CGRectMake(0, MARGIN, self.view.width, [result doubleValue]+ MARGIN);//将WKWebView的高度设置为内容高度
//刷新制定位置Cell
[self refreshWebViewCell];
}];
}
复制代码
刷新Cell高度
-(void)refreshWebViewCell{
[self.myTableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];//刷新制定位置Cell
}
复制代码
cell高度返回WKWebView的高度即可。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return self.wkWebView.heigth;
}
复制代码
记录一个情况
就是WKWebView初始化的时候,高度随便设置为一个非零的数字时,在js获取高度时会不准。
HTML附加内容
网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offsetWidth (包括边线的宽) 网页可见区域高: document.body.offsetHeight (包括边线的高) 网页正文全文宽: document.body.scrollWidth 网页正文全文高: document.body.scrollHeight 网页被卷去的高: document.body.scrollTop 网页被卷去的左: document.body.scrollLeft 网页正文部分上: window.screenTop 网页正文部分左: window.screenLeft 屏幕分辨率的高: window.screen.height 屏幕分辨率的宽: window.screen.width 屏幕可用工作区高度: window.screen.availHeight 屏幕可用工作区宽度: window.screen.availWidth