【问题标题】:UITableViewCell Automatic Row Height not working after asynchronous callUITableViewCell 自动行高在异步调用后不起作用
【发布时间】:2016-05-15 03:45:50
【问题描述】:

我已成功使我的自定义 uitableviewcell 与自动尺寸一起使用。在我的自定义单元格中,我有一个标签(用于显示标题,可以是一行或多行)和一个图像视图。自动布局设置正确,我指定了估计的行高并将行高设置为自动尺寸。当我使用在 viewDidLoad 中设置的虚拟数据时,我的自定义单元格会根据 UILabel 文本动态更改高度。

但是,我必须在我的自定义 tableviewcell 类中进行 API 调用,即在 cellForRowAtIndexPath 方法中获取相应的数据以显示在我的 UILabel 和 UIImageView 中。成功获取数据后,我更新了 UI 元素。但是,在这种情况下,单元格不会动态更改高度,并且我的 UILabel 被截断为一行。

我尝试调用 reloadRowsAtIndexPath 方法,但是当我滚动 tableview 时它会导致奇怪的反弹。我已经尝试了几个小时,知道如何在从 API 调用获取数据后使自动 tableview 行高工作吗?

【问题讨论】:

  • 你为什么在 cellForRowAtIndexPath 中调用你的 api ?您可以在 viewDidLoad() 中调用您的 api,并根据您的要求将结果保存在数组或字典数组中。然后您可以使用此数组来更新 UI 元素。
  • 我认为从 cellForRow 调用 API 是完全正常的......因为我们不想获取用户可能永远不会显示的外部数据。

标签: ios uitableview uitableviewautomaticdimension


【解决方案1】:

检查您是否遵循了这些内容,

  1. self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 50; //将此设置为适合您的任何值。

  2. 将标签的行数设置为 0(最重要)

  3. 如果标签有任何高度限制,则删除

  4. 在 cellForRow 返回一个单元格时,尝试这样做

    cell.contentView.setNeedsLayout() cell.contentView.layoutIfNeeded()

就是这样,它会根据你给出的字符串调整标签的大小。 有关更多信息,请遵循此 https://www.sitepoint.com/self-sizing-cells-uitableview-auto-layout/ 这有一步一步的信息。

【讨论】:

  • 你放在这里的所有东西我都有。我认为问题是我在 Firebase 的异步回调中设置 UI(我使用 Firebase 作为后端)。所以在后台设置实际数据之前,AutoLayout在获取数据之前就已经推导出了高度。这就是为什么我调用 reloadrows 方法来强制单元格按顺序重新加载,以便 AutoLayout 根据返回的数据设置约束。你以前遇到过这样的情况吗?感谢您的回复!
  • @carl pan,您在向上滚动表格视图时是否遇到任何故障?
  • 是的,我在滚动时确实看到了奇怪的反弹。
  • 我已经通过一些解决方法进行了修复,创建了一个 mutableDictionary,然后在 willDisplayCell 方法上设置该字典中的 indexpath 高度。然后实现eatimateRowHeight委托方法,从字典中搜索indexpath,如果有则返回,否则返回UITableViewAutomaticDimension。此解决方法修复了表格视图中的弹跳或故障。
  • 谢谢!我会试一试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多