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

时间:2013-05-24 18:58:22

标签: ios cocoa-touch uitableview uiwebview

好的,所以我知道这个问题已经被问到并被问到了。有很多好的建议,但我无法按预期工作。我正在尝试创建一个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的滚动起伏不定。我怎样才能解决这个问题?并使其顺利?我想在加载视图之前可能以某种方式确定webview高度,但不确定我将如何做到这一点。还尝试将html转换为纯文本字符串,但这会导致错误的高度,因为html包含空格和内容,而纯文本则没有。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分: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
}

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

你可以通过几种方式解决这个问题。这是一个建议。

在UIWebView的webViewDidFinishLoading的委托方法中,检查以确保进行调用的webview是存储在您的媒体资源中的webview。如果是这样,请调用重新加载包含webview的部分(或行)。这应该调用heightForRowAtIndexPath:方法再次调用,在这种情况下,您可以将webview的高度存储在{ {1}}回调。

如果视图首次显示时单元格不在屏幕上,则webViewDidFinishLoading中创建的单元格应该包含您在cellForRowAtIndexPath:中创建的UIWebView。通过将viewDidLoad添加到单元格的内容视图来执行此操作。

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

答案 1 :(得分:2)

在一天结束时,在加载之前,您无法知道webview内容的高度。如果相同的代码位设置表并加载webview,webview总是会在表已经显示后完成它的加载。

如果您反复加载相同的HTML,则可以缓存高度,但第一次仍然会出现问题。

因此,在没有波动的情况下,您能够显示滚动的tableview的唯一方法是在加载webview之前使用默认的单元格高度。然后改变它。但是你已经尝试过使用reload了。那是不稳定的。

但是,默认高度和真实高度之间的单元格高度是什么?也许那会更容易接受。

如果你只做高度变化,我相信你可以这样做而不是重新加载,以便为调整大小设置动画。

[tableView beginUpdates];
[tableView endUpdates];

两条线之间没有任何需要。

也许您可以将此与缓存HTML的真实高度相结合,以便用户下次将其滚动到视图中。

答案 2 :(得分:0)

在你的情况下,你在tableviewcell中有webview,所以在heightForRowAtIndexPath中,将单元格的高度设置为NSAttributedString大小的高度,如下所示。

function admin_addcity() {
    $.ajax({
        type: 'POST',
        url: "elemnts.php",
        data: {
            vals: "form_elemnts"
        },
        success: function (response) {
            $('body').empty();
            $('body').html(response)
            form_events();
        }
    });
}

function form_events() {
    $('#form_submit_button').click(function () {
        $.ajax({
            type: "POST",
            url: "insertformdata.php",
            data: {
                firstname: $("#firstname").val(),
                lastname: $("#lastname").val()
            },
            success: function (response) {
                // this ajax insert data to database several time 
                alert("data is inserted to database");
            }
        })
    }