根据滚动视图上的内容增加表格视图高度

Posted

技术标签:

【中文标题】根据滚动视图上的内容增加表格视图高度【英文标题】:Increase table view height based on content on scrollview 【发布时间】:2019-03-06 15:36:07 【问题描述】:

您好,我想在滚动视图上动态增加表格视图高度。 我会尝试下面的代码,即使它也不起作用

这里的items是tableview数据数组

override func viewDidLoad() 
    super.viewDidLoad()
    rewardPointsApi()
    if(items != nil) 
        self.tableviewheight.constant = CGFloat(70*items.count)
    
    tableviewheight.constant = tableview.contentSize.height

【问题讨论】:

您想增加表格视图的高度以使其等于其内容,并使用附加滚动视图处理滚动 - 为什么?执行一些魔术来实现开箱即用的功能不仅没有意义,而且由于它基本上丢弃了表格视图的单元格重用机制,因此它也非常低效和消耗内存。它的目的是什么? 好的,我同意你的观点,我在当时我们正在做的事情上沿着滚动视图查看了一些数据。 【参考方案1】:

有时使用 tableview 的内容大小设置常量不会正确更新高度,因为 tableview 正在重新加载或自行计算

最好的地方是什么?

如果你有静态数据,那么viewDidAppear 可能是最好的地方

 override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        self.view.layoutIfNeeded()
        self.heightConstraint.constant = self.tableView.contentSize.height
        self.view.layoutIfNeeded()

  

如果您的数据是动态的,例如调用 API。然后在主队列内的响应块内。

DispatchQueue.main.async 
        self.tableView.reloadData()
        self.view.layoutIfNeeded()
        self.heightConstraint.constant = self.tableView.contentSize.height 
        self.view.layoutIfNeeded()
 

重要提示:与内容大小直接相关的因素是estimateRowHeight 因此,如果您确定单元格的高度,那么您可以在静态行数的情况下直接应用

希望它对您和面临同样问题的其他人有所帮助

【讨论】:

【参考方案2】:

在得到 api 响应后使用以下代码,首先将数据分配给 item 数组,然后重新加载表视图并设置高度约束 UItableview 并禁用 tableview 自滚动参见下面的代码。

if(items != nil)

     DispatchQueue.main.async 
         tableView.reloadData()
         tableviewheight.constant = tableview.contentSize.height
         tableView.isScrollEnabled = false
         self.view.layoutIfNeeded()
     
 

【讨论】:

【参考方案3】:

目前,您在rewardPointsApi() 之后立即在上面写代码,如果您正在等待对此方法的响应,如果它的异步请求您的代码将不起作用,那么您的逻辑将起作用。 在 tableView 中重新加载数据后,您需要添加以下行以响应 rewardPointsApi()

        tableviewheight.constant = tableview.contentSize.height

【讨论】:

【参考方案4】:

在委托方法中根据表格设置约束高度 查看内容大小

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    self.constraint_height.constant = self.tblview.contentSize.height

在获取 api 响应时,如果需要,重新加载并查看布局

 self.tblview.reloadData()
 self.view.layoutIfNeeded()
 self.constraint_height.constant = self.tblview.contentSize.height
 self.view.layoutIfNeeded()

【讨论】:

以上是关于根据滚动视图上的内容增加表格视图高度的主要内容,如果未能解决你的问题,请参考以下文章

如何动态调整滚动视图高度

如何将 UITableView 的高度调整为内容大小的高度?

如何让表格视图滚动到图像视图上方?

为啥有时滚动视图和子视图大小不一致

如何将滚动视图嵌入到表格视图中

带有动态内容的滚动视图的 iOS UITableViewCell