将UIWebView的大小调整为其内容

时间:2011-05-24 03:05:42

标签: javascript iphone objective-c uiwebview

在UITextView中,我可以将控件的高度调整为如下内容:

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;

但我想使用UIWebView来显示富文本。 UIWebVie的内容是:

NSString *myDescriptionHTML = [NSString stringWithFormat:@"<html> \n"
                                  "<head> \n"
                                  "<style type=\"text/css\"> \n"
                                  "body {font-family: \"%@\"; font-size: %@; }\n"
                                  "</style> \n"
                                  "</head> \n"
                                  "<body>%@</body> \n"
                                  "</html>", @"helvetica",
                                  [NSNumber numberWithInt:12], @"yadayadayada..."];
[webView loadHTMLString:myDescriptionHTML baseURL:nil];

因此UIWebView只包含纯文本。如何获得类似于上述UITextView代码的结果?

6 个答案:

答案 0 :(得分:14)

虽然理论上提供了JavaScript方法

- (void)webViewDidFinishLoad:(UIWebView *)webview
    CGRect oldBounds = [[self webview] bounds];
    CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    [webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}

应该工作(并且似乎适用于大多数人),它只是不适合我。我尝试了一些变化,它总是返回一个与真实内容的高度无关的大小。例如,一个衬垫将具有260或244高度。不知道为什么(很想知道)。

所以我最后在this回答中暗示:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGRect frame = aWebView.frame;
    frame.size.height = 1;
    aWebView.frame = frame;
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    frame.size = fittingSize;
    aWebView.frame = frame;

    NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
}

我认为JS方式更优雅但是地狱,它对我不起作用并且无法弄清楚原因,而这种方法开箱即用。

答案 1 :(得分:2)

与Micheal建议类似,您应该可以通过在webview的webViewDidFinishLoad回调中调用javascript来获取内容的高度

ex(未经测试):

- (void)webViewDidFinishLoad:(UIWebView *)webview
    CGRect oldBounds = [[self webview] bounds];
    CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    [webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}

如果用户将高度设置为“自动”https://github.com/appcelerator/titanium_mobile/blob/master/iphone/Classes/TiUIWebView.m#L616

,这基于Appcelerator Titanium中用于根据高度调整其Web视图大小的方法

答案 2 :(得分:2)

我知道这已经过时但我找不到最近的问题答案。 我最终得到了这个解决方案。这在使用约束时有效。

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    // get content size
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    // ajust the height constraint of the webview to the content size
    [self.webviewHeightConstraint setConstant:fittingSize.height];
}

答案 3 :(得分:1)

对此没有简单的答案,因为UIWebView是一个复杂的滚动视图。您可以尝试的一些事情,必须在UIWebView委托通知网页完成加载(使用webViewDidFinishLoad :)后完成所有操作。一旦委托知道UIWebView已加载,我会尝试这样做:

  • 尝试相同的contentSize技巧,不太可能它会起作用,但如果页面已加载
  • 使用javascript获取高度,如下所示:

    CGFloat windowHeight = [[webView stringByEvaluatingJavaScriptFromString:@“return document.body.scrollHeight;”] floatValue];

然后像使用任何其他视图那样用高度来做你的魔法。

答案 4 :(得分:1)

这是你在寻找什么? UIScrollView * scroll = [[webView subviews] objectAtIndex:0];     CGFloat flo = scroll.contentSize.height;

答案 5 :(得分:0)

也许缩短代码?

_webView.frame = CGRectMake(_webView.frame.origin.x, _webView.frame.origin.y, _webView.frame.size.width, 1);
CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
_webView.frame = CGRectMake(_webView.frame.origin.x, _webView.frame.origin.y, _webView.frame.size.width, fittingSize.height);