gpt4 book ai didi

iphone - UITableViewCell 持有一个具有动态高度和加载动画的 UIWebViewCell

转载 作者:行者123 更新时间:2023-12-01 19:27:16 26 4
gpt4 key购买 nike

我目前正在尝试将 UIWebView(在其他元素中)嵌套到自定义 UITableViewCell 子类中。

我需要动态确定单元格的大小(使用 heightForRowAtIndexPath),但由于某种原因,当我这样做时,高度总是打印为 0:

UIWebView* wv = [[[UIWebView alloc] init] autorelease];
[wv loadHTMLString:body baseURL:nil];
[wv setNeedsLayout]; //I don't think these are necessary but I tried anyway.
[wv setNeedsDisplay];
CGSize wvSize = [wv sizeThatFits:webViewBounds];
NSLog(@"WVHEIGHT %f", wvSize.height); //THIS IS WHERE IT PRINTS.
CGFloat retVal = 10.0f;
retVal += 50 > wvSize.height ? 50 : wvSize.height;
retVal += 2 + 15 + 10;

return retVal;

现在,如果我使用我在 cellForRowAtIndexPath 中可以访问的 cell.webView 进行完全相同的计算,它会返回一个非零值。但是,我真的很想避免加载整个单元格,只是为了弄清楚它应该有多高......

此外,UIWebView 在渲染文本时非常慢(不幸的是,我使用 UIWebView 是不可协商的),所以我想知道是否有办法告诉它显示典型的 Apple“旋转齿轮”事件图标,直到它的文本完全已加载并准备渲染。

最佳答案

我建议隐藏每个 UIWebView 直到它完成加载,并显示一个加载指示器。然后,我将使用与标签匹配的键创建一个字典,并且对于字典中的每个条目,我将存储 UIWebView 的大小。

使您的 Controller 符合 UIWebViewDelegate协议(protocol),并使用以下代码:

- (void)webViewDidFinishLoad:(UIWebView *)webView {

NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('this').offsetHeight;"];

[self.webViewHeights setValue:[output floatValue] forKey:[NSString stringWithFormat:@"%f", webView.tag]];

}

之后,添加代码以隐藏加载 View 并显示 UIWebView,然后调用表重新加载。在您的单元格高度方法中,只需检查您的 UIWebView 高度的正确数组元素。

编辑:

看来我遗漏了重要的部分!

好的,所以,要创建不可见的 UIWebViews,您只需要创建它们,而不是实际将它们添加到 View 中。例如,您可以在 viewDidLoad 中执行类似的操作。方法:
UIWebView *newWebView = [[UIWebView alloc] initWithFrame:newFrame];
[newWebView loadHTMLString:body baseURL:nil];
newWebView.tag = 1;

[self.webViewDictionary setObject:newWebView forKey:@"1"];

然后在你的表格代码中,说类似
NSString *tagString = [NSString stringWithFormat:@"%d", indexPath.row];
UIWebView *curWebView = [self.webViewDictionary objectForKey:tagString];

if (curWebView.loading == NO) {

CGRect newFrame = curWebView.frame;
newFrame.size.height = [self.webViewHeights objectForKey:tagString];
curWebView.frame = newFrame;

[cell addSubview:curWebView];

} else {

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorStyleGray];

[cell addSubview:activityIndicator];

}

关于iphone - UITableViewCell 持有一个具有动态高度和加载动画的 UIWebViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6417852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com