如何检测表格视图何时完成绘制单元格?
我在UITableViewCell的contentView中有两个标签。这些标签的大小是动态的。我能够通过子类化UITableViewCell来实现,在drawRect方法中,我根据内容调整两个标签的帧。现在我想对齐所有第二个标签。
问题是,如果我使用以下代码:
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循环遍历所有单元格来实现此目的,但是虽然它成功返回单元格但是内容未被绘制,这意味着框架保持宽度为零。
有没有人有解决方案?
提前致谢,
标记
答案 0 :(得分:2)
尝试在这些标签的内容上调用sizeWithFont:
,以便在绘制任何内容之前获得最大宽度。您可以稍后在cellForRowAtIndexPath:
中使用它来根据需要调整宽度。
我建议您重新考虑使用UITableViewCellStyleValue2
单元格,并尝试配置textLabel和detailTextLabel。我有类似的情况,this就是我做的。
答案 1 :(得分:1)
首先,你真的应该只选择一个明确的,固定的位置,第一个标签结束,第二个标签开始,根据你对这些标签中文字的最小和最大长度的了解。这将完全消除这个问题。
但是如果你想要一个解决方案:使用sizeWithFont:
方法或其中一个表兄弟(参见Xcode文档)。具体来说,循环遍历第一个标签中的值,将sizeWithFont
应用于每个标签,并跟踪您看到的最大宽度。 (我假设您在进入单元格之前可以访问这些值;因为它们是动态的,它们必须通过表视图控制器,不是吗?)
现在您拥有所寻求的价值,而无需执行创建一堆单元格对象的极其浪费的操作,并且从不将它们用于预期目的。
答案 2 :(得分:0)
我认为您需要做的是将一个viewController添加到让UITableViewController控制UITableViewCell本身,以便您可以捕获标签加载的事件。 viewController将引用两个标签,因此它可以相应地调整它们以响应-viewDidAppear
。
我从来没有这样做,但UITableViewCell是一个像其他任何一个视图,所以你应该能够为它设置一个控制器。您可能需要手动激活控制器,因为在此上下文中没有导航控制器可以为您执行此操作。