6

问题

您如何检测表格视图何时完成绘制单元格?

问题

我在 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 遍历所有单元格来实现这一点,但是尽管它成功返回了单元格,但内容尚未绘制,这意味着框架的宽度仍然为零。

有没有人有办法解决吗?

提前致谢,

标记

4

3 回答 3

2

在绘制任何内容之前,请尝试调用sizeWithFont:这些标签的内容以获取最大宽度。您应该可以稍后在您cellForRowAtIndexPath:需要时使用它来调整宽度。

我建议您重新考虑使用UITableViewCellStyleValue2单元格并尝试配置 textLabel 和 detailTextLabel。我有类似的情况,就是我的做法。

于 2010-01-29T23:20:41.587 回答
1

首先,您真的应该根据您对将放在这些标签中的文本的最小和最大长度的了解,选择一个明确的、固定的位置,第一个标签结束和第二个标签开始的位置。那将完全消除这个问题。

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

现在您拥有了您所寻求的价值,而不必执行创建一堆单元对象的极其浪费的操作,并且永远不会将它们用于预期目的。

于 2010-02-03T08:29:06.110 回答
0

我认为您需要做的是添加一个 viewController 以使 UITableViewController 控制 UITableViewCell 本身,以便您可以捕获标签加载的事件。viewController 将引用这两个标签,因此它可以相应地调整它们以响应-viewDidAppear.

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

于 2010-01-26T16:19:59.667 回答