代码之家  ›  专栏  ›  技术社区  ›  Jasarien

基于内容字体大小动态调整UIWebView大小

  •  7
  • Jasarien  · 技术社区  · 16 年前

    我有一些文本需要在我的应用程序中显示。文本包含需要交互的链接。我已经尝试了一些解决方案,使tappable链接 UITextViews 和 UILabels .

    1. UITextView

      • UITextView视图 提供数据检测器,用于检测URL并使其可访问。
      • 对我来说是不可用的,因为这个链接只能在Safari中从外部打开,所以没有办法控制这个链接并做我想做的事情。
    2. UILabel 使用“花式标签”的链接( http://furbo.org/2008/10/07/fancy-uilabels/ )

      • 几乎是完美的解决方案,提供了检测链接和一种方式,让用户看到和点击他们的内联,并让我完全控制如何处理一个链接时,按下。
      • UIButton s来覆盖链接,它们不会在长链接上用文本换行。

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

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

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

    • sizeToFit 什么都不做(或者更可能的是,只是将大小设置为当前帧的大小)。
    • sizeThatFits: 返回其当前大小。
    • NSString 的 sizeWithFont:constrainedToSize: 不可行因为 UIWebView 和 UIFont 对18号有不同的表示。
      • 只是为了详细说明这一点。在我的测试中,我发现scaleFactor为1.0和 scalesPageToFit NO 整个页面的字体大小设置为13.5pt(在CSS中)会呈现与文本大小相同的文本 UILabel标签 UIFont字体
    • 另外,在webView中,我使用CSS属性 word-wrap: break-word; 为了防止webView用长单词或url水平滚动。因此,webView和 UILineBreakModeWordWrap 完全不同。甚至使用 UILineBreakModeCharacterWrap

    不是没有办法,就是我太笨了,错过了一些简单的事情。如果有人能提供一些见解,我将非常感激。谢谢。

    2 回复  |  直到 12 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    实际上,你可以用 -sizeThatFits: my response 类似的问题。

        2
  •  2
  •   Jasarien    16 年前

    我在学校找到了解决问题的办法 http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html

    我不相信这是最好的解决办法,但它是有效的。如果有人有更好的主意,我会很高兴听到的。

    我最后在我的webView上运行了javascript webViewDidFinishLoad:

    - (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];
        }
    }
    

    由于原始值没有考虑边距大小等因素,我不得不稍微填充高度。