好的,所以我知道这个问题已经被问过了。有很多好的建议,但我无法让它按预期工作。我正在尝试创建一个 tableview 单元格,它可以根据不同的 html 动态设置其加载高度。大家建议的是使用下面的方法。
-(void)webViewDidFinishLoad:(UIWebView *)webView
他们说要使用 javascript 计算高度,如下所示:
NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
或者做这样的事情(我创造了这个):
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;
这两种方法都返回正确的 webview 高度,但它们发生在 tableview 初始化之后。这个 webViewDidFinishLoad 在 heightForRowAtIndexPath 方法之后被调用。因此,在构建表格时,我没有单元格的高度。因此,每个人都说好,然后只需在您的 webViewDidFinishLoad 中重新加载 tableview,这再次起作用,但我不喜欢这样,因为存在滞后,当您到达该部分时,它会使 tableview 的滚动变得不稳定。我怎样才能解决这个问题?并使其平滑?我在考虑在加载 View 之前可能以某种方式确定 webview 高度,但不确定我将如何做到这一点。还尝试将 html 转换为纯文本字符串,但这会导致错误的高度,因为 html 有空格和内容,而纯文本没有。任何帮助将不胜感激!
最佳答案
我的建议与@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
}
在这种情况下,您的 heightForRowAtIndexPath:
仍可能会在 WebView 完成之前被调用。
您可以通过多种方式处理该问题。这是一个建议。
在 UIWebView 的 webViewDidFinishLoading
的委托(delegate)方法中,检查以确保进行调用的 webview 是存储在您的属性中的 webview。如果是这样,请调用以重新加载您的 webview 所在的部分(或行)。这应该调用 heightForRowAtIndexPath:
方法以再次调用,在这种情况下,您可以存储webViewDidFinishLoading
回调中的 webview。
如果 View 首次显示时单元格不在屏幕上,则在 cellForRowAtIndexPath:
中创建的单元格应该具有您在 中创建的
。通过将 UIWebView
查看DidLoadUIWebView
添加到单元格的内容 View 来执行此操作。
如果 View 首次显示时单元格在屏幕上,我建议在单元格第一次加载时使用事件微调器,然后在 webview 加载完成后,使用 webview 重新加载单元格。
关于ios - 根据动态本地内容确定 UIWebView 高度,在可变高度 TableViewCell 内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16741871/