【问题标题】:How do I change the height of a table cell that has already loaded?如何更改已加载的表格单元格的高度?
【发布时间】:2013-12-18 19:07:52
【问题描述】:

目前,我在自定义的 uitableview 单元格中加载了 webviews。问题是 Web 视图的大小可变。在 webViewDidFinishLoad 中,我可以根据 html 文档的实际大小来设置 Web 视图的大小。我的问题是在 web 视图完成加载之前已经在 heightForRowAtIndexPath 中设置了高度的表格单元格。加载后如何更改表格单元格的高度?

理想情况下,我觉得我应该能够使用这样的代码行。

cellW.frame = cellW.cellWebView.frame;

但是,我似乎无法访问 heightForRowAtIndexPath 中的单元格信息。我觉得我已经很好地解释了这种情况,但是你认为我应该发布的任何代码我都可以放在这里。我已经尝试了很多东西(所以到处都有 cmets 和失败的尝试),但主要问题是我似乎无法在正确的位置访问单元格信息,例如 heightForRowAtIndexPath。如果我什至可以在 webViewDidFinishLoad 中以某种方式设置单元格信息,我可以简单地设置单元格的框架,我还设置了 web 视图的框架大小。

下面是我的表格单元子类的设置。

#import <UIKit/UIKit.h>
#import "DefinitionsAndConstants.h"

@interface UITableViewCellWebView : UITableViewCell
{
    UIWebView *cellWebView;
}

@property (nonatomic,retain) UIWebView *cellWebView;
@end

这是我最后一次尝试使用部分 Gavin 的代码。但是,既然我已经退出了,当然没有办法设置表格单元格,因为 cellForRowAtIndexPath 是不可分配的。

-(void)webViewDidFinishLoad:(UIWebView *)webViews {
    [webViews stringByEvaluatingJavaScriptFromString:@"twitterfy()"];
    [webViews stringByEvaluatingJavaScriptFromString:@"document.getElementById('tweettext').innerHTML=tweet"];
    NSString* h = [webViews stringByEvaluatingJavaScriptFromString:@"getDocHeightMax()"];
    int height = [h intValue];
    webViews.frame = CGRectMake(0.0f, 0.0f, 320.0f, height);

    NSString* i = [webViews stringByEvaluatingJavaScriptFromString:@"return indexPath"];
    int ii = [i intValue];
    NSIndexPath* ip = [NSIndexPath indexPathForRow:ii inSection:0];

    UITableViewCellWebView *tableCell = (UITableViewCellWebView *)[self.tableView cellForRowAtIndexPath:ip];

    if (tableCell) {
        tableCell.frame = webViews.frame;
    }

    NSLog(@"Got height from webview %d", height);
}

【问题讨论】:

  • 我确实找到了与此相关的其他问题,但似乎没有一个涉及动态单元格高度。
  • 你在哪里加载你的网页视图?如果你只是在viewDidLoad 中进行,应该在绘制表格之前完成加载,对吧?对不起,如果这是一个愚蠢的问题 - 我以前没有使用过 webviews。
  • Web 视图在那里加载,但直到 webViewDidFinishLoad 在 heightForRowAtIndexPath 已经执行后它们才完成渲染内容。因此,直到 webViewDidFinishLoad 才计算内容的高度。

标签: ios uitableview uiwebview heightforrowatindexpath


【解决方案1】:

我会设置一个可变数组来读取高度。在viewDidLoad 中,您必须分配一些起始值(可能只是一堆@"44.0",这并不重要,它不会被使用太多)。在您的heightForRowAtIndexPath: 中,只需返回该数组中的数字。然后在webViewDidFinishLoad 中,将数组中的高度替换为该单元格实际需要的高度(我相信您发布的代码中的NSString *h),并在您的表格视图中调用reloadDatareloadData 将点击 heightForRowAtIndexPath:,它将查看 heights 数组,该数组现在具有该单元格所需的实际高度,因此一切都应该是闪亮的。

【讨论】:

  • 我喜欢这个想法,我只是尝试过,但我怀疑 reloadData 会重绘单元格并导致 web 视图再次呈现,从而导致无限循环。由于 web 视图仅在单元格可见时才会呈现,因此向下滚动会进一步导致更疯狂的无限循环。视图看起来大部分是正确的,但在无限循环不可避免的崩溃之前一直不稳定。
  • 我想我可能需要说一下,当数组中的正确行已经填满时,不要重新加载数据。我会再测试一些,让你知道它是怎么回事。
  • @Caimen:嗯,需要重绘cellForRowAtIndexPath:中的webviews吗?当用户与之交互时,它会发生变化吗?我很想在viewDidLoad 中构建所有单元格,将它们放入一个数组中,然后将单元格从该数组中拉出cellForRowAtIndexPath:,而不是使用reuseIdentifiers。似乎我在表格视图方面获得的经验越多,我就越喜欢构建一次单元格然后完成它的想法(而不是在 cellForRowAtIndexPath 中构建它们,因为我需要它们)。
  • 我已经停止了无限循环,现在只需检查数组中的正确节点,并且在设置值时不重新加载视图。目前有一些无法解释的空白显示,但我相当肯定你让我走上了正确的轨道。一旦我完全确信解决方案正常工作,我明天可能会检查它是否正确。感谢所有的帮助。
  • 不明白,你是如何解决无限循环的问题的?
【解决方案2】:

你应该能够为你的 heightForRowAtIndexPath 方法做这样的事情:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyTableViewCell *tableCell = (MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];

    if (tableCell) {
        return tableCell.cellWebView.frame.size.height;
    }

    return 44;
}

这样,如果表格单元格可见,它将根据嵌入的 Web 视图的高度设置高度,否则将使用默认高度。为了使表格视图刷新单元格的高度,一旦网络视图的大小正确,您必须调用以下命令:

[self.tableView beginUpdates];
[self.tableView endUpdates];

这不会让它重新加载单元格,这可能会让你搞砸,它只会让它再次检查高度,单元格高度会动画到新的高度。

【讨论】:

  • 这看起来正是我所需要的。但是 UITableViewCellWebView *tableCell = (UITableViewCellWebView *)[self.tableView cellForRowAtIndexPath:indexPath];不断返回 EXC_BAD_ACCESS。我对其中一些还是陌生的,但我猜这表明我有一些更深层次的问题需要先解决。感谢您的帮助。
  • UITableViewCellWebView 你的UITableViewCell 子类,还是UIWebView 的子类?
  • 它是 UITableViewCell 的子类。我在问题中发布了我的子类。
  • 显然在 heightForRowAtIndexPath: 内调用 cellForRowAtIndexPath: 会导致它递归调用 heightForRowAtIndexPath:,这就是它崩溃的原因。详情在stackoverflow.com/questions/12652761/…
  • 单独保存一个为每个索引路径处的 Web 视图计算的高度表,并使用它来获取此处的高度。
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多