如何渲染html以使高度完全适合它?

时间:2012-11-09 07:17:36

标签: objective-c ios ios5 uiwebview ios6

我正在尝试制作一个tumblr应用。当我为任何帖子发出获取请求时,他们会回复身体的html。目前我正在使用html并将其推入uiwebview。我设置了视图的宽度,因为它始终是相同的,但我无法弄清楚如何计算它的高度。我想把它放到一个合适的位置,所以我需要弄清楚每个细胞的高度。

所以基本上可以在渲染html之后获得uiwebview的高度吗?

1 个答案:

答案 0 :(得分:2)

我使用javascript技巧来做到这一点。

在将HTML字符串加载到UIWebView之前,您需要将以下javascript添加到HTML字符串中。

NSMutableString *javaScript = [[NSMutableString alloc] init];
[javaScript appendString:@"<script type=\"text/javascript\">"];
[javaScript appendString:@"  window.onload = function() {"];
[javaScript appendString:@"    window.location.href = \"ready://\" + document.body.offsetHeight;"];
[javaScript appendString:@"  }"];
[javaScript appendString:@"</script>"];

当UIWebView完成渲染并且知道所需的UIWebView高度以显示整个内容而不上下滚动时,将触发此javascript。高度由javascript变量document.body.offsetHeight

给出

javascript会将UIWebView导航到url scheme ready://

document.body.offsetHeight的值存储为“host”

您必须使用UIWebView委托拦截此请求,以便UIWebView无法导航到ready://

- (BOOL)webView:(UIWebView*)webView
shouldStartLoadWithRequest:(NSURLRequest*)request
 navigationType:(UIWebViewNavigationType)navigationType {

    NSURL *url = [request URL];
    if (navigationType == UIWebViewNavigationTypeOther) {
        if ([[url scheme] isEqualToString:@"ready"]) {

            float contentHeight = [[url host] floatValue];
            NSLog(@"web height:%f",contentHeight);

            //You can use the contentHeight to resize the UIWebView frame



            return NO; //Prevent the UIWebView to navigate to this ready:// scheme
        }
    }
    return YES;
}

“ready”方案只是一个任意名称。基本上,JavaScript要求UIWebView导航到ready:// 234

“ready”是自定义URL方案

“234”是UIWebView在不滚动的情况下呈现HTML内容所需高度的示例。