加载 UIWebView 前如何找到其内容的高度

3
我有一些自定义单元格和每个单元格内的Web视图。现在,我的要求是找到要加载到Web视图上的HTML字符串的高度,然后根据此更改自定义单元格高度和Web视图高度。
我知道可以在-webViewDidFinishLoading委托中找到文档的高度,但在我的应用程序中,我有很多单元格和每个单元格内的Web视图,因此我感觉应用程序在滚动和进行不必要的回调时会变慢。
目前,我正在执行以下操作,以获得字符串高度。
 -(float)getDynemicHeight:(NSString *)pstrText
    {
        CGSize constraint = CGSizeMake(683,600);

        CGSize size = [pstrText sizeWithFont:[UIFont systemFontOfSize:18] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

        CGFloat height = MAX(size.height, 44.0f);

        if (height>400) {
            return 400;
        }

        return height;
    }

然而,这会导致问题,因为即使是<div>元素也被视为字符串,因此返回更大的高度值。


看一下RTLabel,我们在我们的应用程序中使用它。 - KDaker
在决定使用Webview作为最佳解决方案之前,我已经浏览了RTLabel和github上的其他几个项目。我已经使用JavaScript在UIWebView中实现了类似的功能。现在唯一的问题是在加载Web视图之前计算其高度(我上面发布的代码片段在大多数情况下都可以正常工作,但如果HTML中有表格等元素,则会出现严重错误)。 - Mani
1
我认为如果你要计算HTML元素(如div、table等)的尺寸,那么唯一的方法就是使用webViewDidFinishLoading方法,在页面加载完成后获取页面的大小... - KDaker
同意。OP所要求的是不可能的。在Web视图绘制复杂的HTML片段之前,您无法知道它将如何绘制。 - matt
嗨,Mani,你解决了这个问题吗?我也遇到了同样的问题,谢谢 :) - Nada Gamal
显示剩余3条评论
1个回答

1
在iOS 6中,如果你只想展示带有样式的文本(而不是混合图像等其他内容),你可能会喜欢使用NSAttributedString而不是Web视图。它允许你在不同的文本段落、段落边距等不同的文本区域内创建具有不同样式的文本,并且其度量标准定义良好并带有测量方法。简单的UIView子类,例如UILabel现在可以显示带属性的字符串。或者你可以直接将其绘制到界面上。

http://www.apeth.com/iOSBook/ch23.html#_attributed_strings

如果你做不到这一点,那么你所尝试的基本上是不可能的。在绘制复杂的HTML之前,你不知道Web视图将如何绘制它。你只能改变你的应用程序架构。例如,你可以提前绘制所有的Web视图,这样在表格数据源时间就有了需要的信息。

感谢提供信息,Matt。我也查看了NSAttributed Strings和UITextView以及Paul Hegarty在斯坦福大学的教程,但不幸的是我的应用程序还需要支持5.0版本。因此,我最终在Web视图中实现了RTF功能。 - Mani
1
我担心那可能是情况... :( - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接