问题是,我有一个包含几个单元格的tableview,并且在其中一个单元格中有一个webView。通过禁用webview上的滚动,我应该在tableView中滚动静态Web内容视图,而不是单独滚动,这一切都很有效。 在webViewDidFinishLoad方法中,我调用
[[webView stringByEvaluatingJavaScriptFromString: @"document.height"] floatValue];
然后通过重新加载表在heightForRowAtIndexPath中设置此值。这一切在iPhone 6及更高版本上运行良好,但在4和5时,我的网页内容的底部被剪掉了。返回的高度差是完全随机的,724像素高度未被剪切和精细,在其他内容上几乎相同的返回像素高度被截断超过原始高度的30%。
我尝试了几种我在这里找到的方法,但没有一种方法可行。 试图从评估偏移高度,滚动高度和其他属性获得最大值,但也没有成功。 还尝试在我的webview上运行jquery命令,但是再次,到目前为止没有成功。 如果有人对此类问题有任何经验,请帮忙。 完整的代码片段,其中“articleViewHeight”是上述webView的约束:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return [self getCellHeight:indexPath.row];
}
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self getCellHeight:indexPath.row];
}
-(CGFloat)getCellHeight:(NSInteger)row{
switch (row) {
case 0:
return self.view.frame.size.height * 0.1f;
break;
case 1:
return self.view.frame.size.height * 0.375f;
break;
case 2:
return UITableViewAutomaticDimension;//self.view.frame.size.height * 0.15f;
break;
case 3:
return self.articleViewHeight;
break;
case 4:
return self.view.frame.size.height * 0.2f;
break;
default:
return UITableViewAutomaticDimension;
break;
}
}
- (void)webViewDidFinishLoad:(UIWebView * _Nonnull)webView{
CGFloat height = [self getWebViewPageHeight];
self.articleViewHeight = height;
[self.tableView reloadData];
[self removeLoader];
}
- (CGFloat) getWebViewPageHeight {
CGFloat height1 = [[self.articleView stringByEvaluatingJavaScriptFromString: @"document.height"] floatValue];
CGFloat height2 = [[self.articleView stringByEvaluatingJavaScriptFromString: @"document.body.scrollHeight"] floatValue];
return MAX(height1, height2);
}
更新:htmlstring加载代码按要求
-(void)doneLoading{
NSString *pathToFile =[[NSBundle mainBundle] pathForResource:@"news" ofType:@"css"];
NSString *fileString = [NSString stringWithContentsOfFile:pathToFile encoding:NSUTF8StringEncoding error:nil];
NSString* headerString = @"<!DOCTYPE html><html><head title='test'><style type=\"text/css\" media=\"all\">%@</style></head><body><div id='content'>%@</div></body></html>";
NSString * theString = [NSString stringWithFormat:headerString,fileString,self.htmlString];
[self.articleView loadHTMLString:theString baseURL:nil];
}
答案 0 :(得分:0)
此解决方案仅适用于您可以自由修改的本地html字符串(好吧,您可以将网页单独下载到字符串中并注入此内容,但是您会遇到其他问题。
我有类似的问题,并找到了解决这些问题的方法。首先,将此脚本添加到html的<head>
标记中。
<script type="text/javascript">
window.onload = function(){
window.location.href = "height://"+document.getElementById("content").offsetHeight;
}
</script>
这是必需的,因为当调用- (void)webViewDidFinishLoad:(UIWebView *)webView;
时,内容仍可能没有正确的高度。此外,将所有html内容放入一个带有脚本id的div中(&#34; content&#34; int this example)。
... html header
<body>
<div id="content">
... your content
</div>
</body>
然后修改您的- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
方法。
-(BOOL)webView:(UIWebView*)pWebView shouldStartLoadWithRequest:(NSURLRequest*)pRequest navigationType:(UIWebViewNavigationType)pNavigationType{
NSURL* url = pRequest.URL;
if(pNavigationType==UIWebViewNavigationTypeLinkClicked){
return ![[UIApplication sharedApplication] openURL:url];
// or do whatever you do with normal links
} else if([url.scheme isEqualToString:@"height"]){
CGFloat contentHeight = [url.host floatValue];
// do your thing with height
}
}
中提琴!这对我来说。任何高度误差都是如此微不足道,以至于在CSS中为内容添加小的(2px)额外底部填充完全显示了我的内容。
修改强>
我刚刚注意到代码中的重要内容。 webview将.scaleToPage
标记设置为NO
,更重要的是:webview的初始高度。它设置为6k。如果我将其更改为0,请确保在加载后剪切内容。
因此,为了获得正确的高度,加载过程中wevbiew的初始高度必须足够大,以便存储整个html内容而无需滚动。
由于您在单元格中拥有自己的网页浏览量,因此无法为您提供帮助。所以也许在绘图堆栈的底部放置另一个隐藏的大webview,宽度与单元格中的宽度相同,然后首先加载你的conent,得到高度然后在单元格中加载它。
答案 1 :(得分:-1)
我要求web view
中有scrollview
。
我处理的方式,没有任何黑客测试。实际上,在单个请求中多次调用此委托方法。您的webViewDidFinishLoad
必须如下所示:
有一位代表- (void)webViewDidFinishLoad:(UIWebView *)webView
我计算网络视图高度: -
- (void)webViewDidFinishLoad:(UIWebView *)webView{
if (webView.isLoading == NO)// as it is called multiple times so wait untill last call
{
NSDictionary* userInfo = @{@"webView": webView};
[[NSNotificationCenter defaultCenter] postNotificationName:WEB_VIEW_FINISH_LOAD object:nil userInfo:userInfo];//sending to compute content size for any view which is using this class
}
[self hideActivityOverlayAnimation:NO];
}
这就是我计算网页视图高度的方法:
-(void)webViewFinishedLoad:(NSNotification*)notification{
if ([notification.name isEqualToString:WEB_VIEW_FINISH_LOAD])
{
NSDictionary* userInfo = notification.userInfo;
UIWebView* webView = (UIWebView*)userInfo[@"webView"];
[webView.scrollView setScrollEnabled:NO];// it was my requirement, dont have to do any thing with height calculation
CGFloat **height** = [[webView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];//every time it returnes different
}
}
您可以使用此高度调整单元格高度。
困扰我的主要部分在上面。我的网页视图设置方法:
self.webView = [[UIWebView alloc] initWithFrame:webViewFrame];
[self.webView setDelegate:self];
self.webView.scalesPageToFit = YES;
self.webView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:self.webView];
希望它能帮到你!!!