代码之家  ›  专栏  ›  技术社区  ›  Mark

UITableView已加载(完成单元格绘制)

  •  6
  • Mark  · 技术社区  · 16 年前

    问题

    如何检测表格视图绘制完单元格的时间?

    问题

    我在UITableViewCell的ContentView中有两个标签。这些标签的大小是动态的。我可以通过子类化UITableViewCell来实现这一点,在DrawRect方法中,我根据标签的内容调整两个标签的帧。现在我要对齐所有第二个标签。

    我的思想在台阶上

    1. 确定表视图中的内容,并让它自动加载。
    2. 在表视图单元格中运行并确定最远的uiTableViewCell中第二个标签的X位置。
    3. 存储此X位置,绘制任何单元格时,使用此X位置放置第二个标签。

    问题是,如果我使用以下代码:

    for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) {
        UITableViewCustomCell *cell = (UITableViewCustomCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0]];
        NSLog ([cell.labelTwo description]);        
    }
    

    第二个标签尚未绘制,这意味着我无法确定框架的大小,因此找不到正确的X位置来对齐所有第二个标签。

    我尝试了对uiTableViewController进行子类化,并查看了一些事件,如viewdidLoad和viewdidAppear。不幸的是,在这些事件中,单元格尚未绘制。

    我想要什么…

    我希望表视图至少绘制一次单元格,以便确定表视图单元格中标签的大小。我想通过使用cellForRow循环遍历所有单元格来完成此操作,但尽管它成功地返回了单元格,但内容尚未绘制,这意味着框架的宽度仍然为零。

    有人有解决办法吗?

    事先谢谢,

    作记号

    3 回复  |  直到 16 年前
        1
  •  2
  •   Ahmed Abdelkader    16 年前

    试着打电话 sizeWithFont: 在这些标签的内容上获取绘制任何内容之前的最大宽度。你以后应该可以在你的 cellForRowAtIndexPath: 根据需要调整宽度。

    我建议你重新考虑使用 UITableViewCellStyleValue2 改为单元格,并尝试配置textLabel和detailtextLabel。我也有类似的情况 this 我就是这么做的。

        2
  •  1
  •   Lawrence    16 年前

    首先,你真的应该根据你所知道的放在标签上的文字的最小和最大长度,选择一个明确的,固定的位置,第一个标签结束,第二个标签开始。这将完全消除这个问题。

    但是如果你想要一个解决方案:使用 sizeWithFont: 方法或其同类方法之一(请参见xcode文档)。具体来说,循环遍历将进入第一个标签的值,应用 sizeWithFont 并跟踪你看到的最大宽度。(我假设在进入单元格之前您可以访问这些值;因为它们是动态的,所以必须通过表视图控制器传递,不是吗?)

    现在你有了你所追求的价值,而不必执行 极度浪费 创建一组单元对象的操作,而不将它们用于预期目的。

        3
  •  0
  •   TechZen    16 年前

    我想你需要做的是 将视图控制器添加到 让uiTableViewController控制uiTableViewCell本身,以便捕获标签加载的事件。viewController将引用这两个标签,因此它可以相应地调整它们以响应 -viewDidAppear .

    我从来没有这样做过,但是UITableViewCell和其他视图一样,是一个视图,所以您应该能够为它设置一个控制器。您可能需要手动激活控制器,因为在此上下文中没有导航控制器可以为您执行此操作。