具有动态高度的UITableViewCell中的UILabel

时间:2013-01-22 13:49:34

标签: ios uitableview uilabel

我在UITableView中实现了动态行高的一些问题 - 但它不是我遇到问题的单元,它是单元内的UILabel。

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

我有一个UITableViewCell的子类,它只保存连接在storyboard中的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;
}

当我构建这个时,我得到了我的桌面视图,其中单元格的大小都是正确的内容高度,但标签都是1行,它们只是在单元格的一侧运行。但是,如果我滚动表格以便单元格离开屏幕,然后向后滚动到它们,它们的标签将正确调整大小,单元格将显示我最初的预期。

我还尝试使用相同的方法计算标签框架,我计算行高,我得到相同的行为 - 它不会正确绘制,直到它滚出屏幕然后回来再次。

我找到了解决这个问题的两种方法,但这两种方法都不是可接受的解决方案。

首先,如果在viewDidAppear中:我在tableview上调用reloadData,单元格和标签第一次正确绘制。这对我的情况不起作用,因为我将在此表中添加和删除单元格,并且我不想在每次添加单元格时调用reloadData。

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

我很感激这个帮助。

3 个答案:

答案 0 :(得分:8)

我最终通过在cellForRowAtIndexPath中分配/初始化标签来解决这个问题。我不完全确定为什么这是一个解决方案 - 但是我遇到的问题似乎与故事板(或者何时?)在单元格中创建对象有关。如果我在cellForRowAtIndexPath中的单元格中分配/初始化标签,则所有内容都会正确加载和调整大小。

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

不确定它是否是最佳解决方案,但目前仍在使用。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我遇到了同样的问题,最后通过在返回单元格之前调用[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; }