【问题标题】:UITableView with rowHeight UITableViewAutomaticDImension does not update when I change the number of lines当我更改行数时,具有 rowHeight UITableViewAutomaticDImension 的 UITableView 不会更新
【发布时间】:2017-04-05 12:29:11
【问题描述】:

我有一个UITableViewCell,底部有一个描述标签,如下所示:

点击描述标签可在30 之间切换numberOfLines

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setupView];
}

-(void) setupView
{

    UITapGestureRecognizer * gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleNumberOfLines)];
    self.jobDescriptionLabel.userInteractionEnabled = YES;
    [self.jobDescriptionLabel addGestureRecognizer:gestureRecognizer];
}

- (void) toggleNumberOfLines {
    if(self.jobDescriptionLabel.numberOfLines != 0){
        self.jobDescriptionLabel.numberOfLines = 0;
    }else{
        self.jobDescriptionLabel.numberOfLines = kNumberOfLines;
    }
    [self.jobDescriptionLabel sizeToFit];
    [self layoutIfNeeded];
}

当我点击标签时,行数会发生变化,但单元格不会扩展以适应新的行数。我该如何解决?

折叠(默认):

扩展:

【问题讨论】:

  • 仍然无法理解您的实际问题。问题出在标签或展开的 tableView 上??
  • UITableViewAutomaticDimension 根据单元格的内容自动计算单元格的高度。就我而言,我正在更新标签的高度,但表格视图不会更新单元格的高度。如何让 tableview 更新单元格的高度
  • 您需要强制重新加载表格。首先将调用HeightOfRow 方法,然后调用cellForRow。因此,当调用 HeightOfRow 方法时,请确保您有一个新的标签高度。请添加您为此完成的代码工作。

标签: ios uitableview ios-autolayout uitableviewautomaticdimension


【解决方案1】:

如果您的约束设置正确,您不需要重新加载数据 --- 不需要重新加载整个表,甚至不需要重新加载受影响的行。

最好的方法是将委托函数添加回您的 tableview 控制器,然后背靠背调用这些行:

tableView.beginUpdates()
tablebleView.endUpdates()

这将告诉自动布局重新计算行高。

编辑:检查我的答案 - 其中包括一个演示项目的链接 - 在这里:Expand UILabel inside UITableView with "more" button like Instagram

【讨论】:

  • 太棒了!简直太棒了!非常感谢
【解决方案2】:

当单元格布置它的子视图时,表格视图实际上并没有任何方式知道发生了什么变化。您必须手动告诉表视图重新计算。

您可能想要重新加载表格视图,或者至少要重新加载发生更改的单元格。

查看reloadData 以重新加载整个表视图,或者查看reloadRowsAtIndexPaths: 如果您只想重新加载Apple reference docs 中的特定索引。

【讨论】:

  • 这种方法的问题是,当我调用reloadRowsAtIndexPaths 时,它会重新创建单元格。这意味着我需要将状态 jobDescriptionExpanded 存储在我的 UIViewController 中,并在创建单元格时传递它。虽然这可行,但它并不完全优雅
  • 为什么不使用UITableViewCell的选中状态来决定jobDescriptionExpanded的值呢?不幸的是,让UITableView 更新其单元格高度的唯一方法是重新加载单元格。因此,无论您认为自己的解决方案多么“不雅”,您都必须这样做。
【解决方案3】:

您可以在 heightForRowAtindexPath: 中更新 tableview 单元格高度。 调用 reloadRowsAtIndexPath 方法更新 UITableView 的单行。

self.dataTableView.beginUpdates()
self.dataTableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.automatic)
self.dataTableView.endUpdates()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多