在可变高度TableViewCell内,根据动态本地内容确定UIWebView高度

mik*_*396 5 cocoa-touch uiwebview uitableview ios

好的,所以我知道这个问题已经被问到并被问到了.有很多好的建议,但我无法按预期工作.我正在尝试创建一个tableview单元格,可以根据不同的html动态设置其加载高度.每个人都建议使用以下方法.

-(void)webViewDidFinishLoad:(UIWebView *)webView 
Run Code Online (Sandbox Code Playgroud)

他们说使用javascript计算高度如下:

NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"]; 
Run Code Online (Sandbox Code Playgroud)

或者做这样的事情(我创造了这个):

self.webView = webView;
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
Run Code Online (Sandbox Code Playgroud)

这两种方法都返回webview的正确高度,但它们是在初始化tableview之后发生的.此webViewDidFinishLoad在heightForRowAtIndexPath方法之后调用.因此,当建造桌子时,我没有牢房的高度.那么每个人都说好了然后只是在你的webViewDidFinishLoad中重新加载一个tableview重新加载它再次起作用,但我不喜欢这个,因为有一个滞后,当你到达那个部分时它会使tableview的滚动起伏不定.我怎样才能解决这个问题?并使其顺利?我想在加载视图之前可能以某种方式确定webview高度,但不确定我将如何做到这一点.还尝试将html转换为纯文本字符串,但这会导致错误的高度,因为html包含空格和内容,而纯文本则没有.任何帮助,将不胜感激!

Dav*_*Dev 3

我的建议与 @Timothy Moose 非常相似,通过将 webview 呈现在屏幕之外。

我在这里采取的方法是......

-(void)viewDidLoad
{
     //Create a UIWebView and store it in a property
     //Hook the delegate to the view controller.
     //Load the html string to the UIWebView.

     //The rest of your initialization
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的意愿heightForRowAtIndexPath:仍然可能在 Web 视图完成之前被调用。

您可以通过几种方式来处理这个问题。这是一个建议。

在 UIWebView 的委托方法中webViewDidFinishLoading,检查以确保进行调用的 webview 是存储在您的属性中的 webview。如果是这样,请调用以重新加载您的 Web 视图所在的部分(或行)。这应该调用该heightForRowAtIndexPath:方法以再次调用,在这种情况下,您可以在回调中存储 Web 视图的高度webViewDidFinishLoading

如果视图首次显示时单元格位于屏幕外,则在 中创建的单元cellForRowAtIndexPath:格应该具有UIWebView您在viewDidLoad. UIWebView通过将 添加到单元格的内容视图来执行此操作。

如果视图首次显示时单元格位于屏幕上,我建议在第一次加载单元格时使用活动微调器,然后在 Web 视图加载完成后,使用 Web 视图重新加载单元格。