具有dynamic高度的UITableViewCell中的UILabel

我有一些问题在UITableView中实现dynamic行高 – 但它不是我遇到问题的单元格,它在单元格内的UILabel。

单元格只包含一个UILabel来显示文本。 我的tableView:heightForRowAtIndexPath:通过使用NSString的sizeWithFont:方法计算标签的高度,正确调整每个单元格的大小。

我有一个UITableViewCell的子类,它只保存了故事板中的UILabel属性。 在故事板中,我将它的行设置为0,所以它将使用尽可能多的行,并将其lineBreak设置为Word Wrap。

以下是我如何设置单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; SomeObject *object = self.tableObjects[index.row]; cell.myLabel.text = [object cellText]; [cell.myLabel sizeToFit]; return cell; } 

当我build立这个时,我得到了我的表格视图与单元格的大小正确的高度为他们的内容,但标签都是1行,只是跑在单元格的一边。 但是,如果我滚动表格,让单元格离开屏幕,然后再滚动到它们,它们的标签将正确resize,单元格将显示我最初的预期。

我也试图用相同的方法计算标签的框架,我正在计算行高,我得到了相同的行为 – 它不能正确绘制,直到它滚动屏幕,然后再次。

我已经find了两种方法来解决这个问题,而且这两种方法都不是可以接受

首先,如果在viewDidAppear:我在我的tableview调用reloadData,单元格和标签第一次正确绘制自己。 这不适用于我的情况,因为我将添加和删除单元格到这个表,我不想每次添加一个单元格时调用reloadData。

第二种解决方法对我来说似乎很奇怪 – 如果我将字体设置保留在UILabel上的默认系统字体17上,那么单元格会正确绘制自己。 只要我改变字体大小,它就会恢复到它不能正确绘制标签的行为,直到它离开屏幕并返回,或者在tableView上调用reloadData。

我将不胜感激任何帮助。

我结束了解决这个通过alloc / init'ing cellForRowAtIndexPath中的标签。 我不完全确定为什么这是一个解决scheme – 但似乎我遇到的问题与故事板(或时,也许?)如何创build单元格内的对象有关。 如果我在cellForRowAtIndexPath中的单元格中分配/初始化标签,则所有内容都将正确加载和大小。

所以…我目前的解决方法是检查单元格是否有我的自定义标签。 如果没有,我分配/初始化标签,并把它放在单元格中。 如果它确实有一个,就像它已经出队的一个单元格一样,那么我只是在已经存在的标签中设置文本。

不知道是否是最好的解决scheme,但现在工作。

我最终通过取消IB中的AutoSizingcheckbox来解决这个问题。 目前还不清楚为什么自动布局导致这个问题。

我跑了相同的问题,我最终解决它通过在返回单元格之前调用[cell layoutIfNeeded]

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; SomeObject *object = self.tableObjects[index.row]; cell.myLabel.text = [object cellText]; [cell layoutIfNeeded]; return cell; }