UIWebView“document.height”评估在旧版iphone上返回错误的高度(特别是4s和5)

时间:2016-05-25 15:05:00

标签: ios objective-c iphone uiwebview

问题是,我有一个包含几个单元格的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];
}

2 个答案:

答案 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];

希望它能帮到你!!!