根据UIWebView的内容字体大小动态调整UIWebView的大小

时间:2010-08-27 09:46:49

标签: ios iphone uiwebview uikit font-size

我有一些需要在我的应用中显示的文字。该文本包含需要交互的链接。我在UITextViewsUILabels中尝试了一些用于制作可点击链接的解决方案。

  1. UITextView链接

    • UITextView提供了数据检测器,可以接收网址并使其可以点播。
    • 我无法使用,因为该链接只会在Safari外部打开,无法控制并通过链接执行我想要的操作。
  2. UILabel使用“Fancy Labels”链接(http://furbo.org/2008/10/07/fancy-uilabels/

    • 几乎是完美的解决方案,提供链接检测和用户内联方式查看和点击它们的方式,让我完全控制按下链接时如何处理。
    • 目前无法使用,因为该实现使用UIButton来覆盖链接,并且它们不会包含长链接上的文本。
  3. 最后我决定使用webview。我将文本传递给webview,并围绕它构建一个基本的HTML包装器,所有东西都是hunky-dory。这与Twitter for iPhone(又名Tweetie)使用的方法相同。

    我现在唯一的问题是,如果文本太长,webview会剪切溢出并滚动以查看剪切的文本。 其次,如果文字太短,那么webview下面就会有一大片浪费的空间。

    与Tweetie不同,我在webview下面有更多内容,我想避免滚动溢出或浪费空间。无论如何,webview都是滚动视图的子视图,因此整个页面的内容可以增长,而不需要滚动子视图。

    有没有什么方法可以动态调整webview的大小,以便它根据内容的高度而定?

    到目前为止,我尝试了很多东西,似乎没有什么是可靠的解决方案:

    • sizeToFit什么都不做(或者更有可能,只是将大小设置为当前帧的大小)。
    • 无论如何,
    • sizeThatFits:会返回当前大小。
    • NSString的{​​{1}}不可行,因为sizeWithFont:constrainedToSize:UIWebView对18的大小有不同的表示。
      • 只是详细说明这一点。在我的测试中,我发现一个scaleFactor为1.0且UIFont设置为scalesPageToFit的webView,并且整个页面的字体大小设置为13.5pt(在CSS中)呈现的文本是与大小为NO的{​​{1}}大小相同。如果有人能解释我,我会很感激。
    • 此外,在webView中我使用CSS属性UILabel,以防止webView水平滚动长字或URL。因此,webView和UIFont之间的包装行为完全不同。即使使用word-wrap: break-word;也不会产生相同的结果。

    要么没有办法做到这一点,要么我愚蠢而且缺少一些简单的东西。如果有人能提供一些见解,我将非常感激。感谢。

2 个答案:

答案 0 :(得分:3)

实际上,您可以使用-sizeThatFits:进行一些小技巧。有关类似问题,请参阅my response

答案 1 :(得分:2)

我在http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html

找到了解决问题的方法

我不相信这是最好的解决方案,但它正在发挥作用。如果有人有任何更好的想法,我会很高兴听到他们。

我最终在webViewDidFinishLoad:的webView上运行了这个javascript。我有一个div元素包装我的内容称为body,所以我的代码看起来像:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *string = [_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"body\").offsetHeight;"];
    CGFloat height = [string floatValue] + 8;
    CGRect frame = [_webView frame];
    frame.size.height = height;
    [_webView setFrame:frame];

    if ([[self delegate] respondsToSelector:@selector(webViewController:webViewDidResize:)])
    {
        [[self delegate] webViewController:self webViewDidResize:frame.size];
    }
}

由于原始值未考虑边距大小等,我不得不略微填充高度

在我达到高度后,我打电话给我的代表,webview确实调整了大小,以便完成布局。