当单元格高度为动态时设置 UITableView 的高度

Posted

技术标签:

【中文标题】当单元格高度为动态时设置 UITableView 的高度【英文标题】:Setting the height of the UITableView when the height of the cells is dynamic 【发布时间】:2017-12-14 05:35:36 【问题描述】:

我正在 swift 3 中为 ios 开发一个应用程序,其中有一个视图控制器具有其他视图(UIImageViewUICollectionView),并且内容可以通过UIScrollView 滚动。 我想在中间某处添加UITableViewUITableView 将具有动态高度的单元格。一切正常,除了我无法设置UITableView 的高度来包装其内容,以便UITableView 的所有单元格在不滚动表格的情况下可见。我想关闭UITableView 和表格视图的滚动以设置其高度以使所有单元格可见而无需滚动。

我根本无法将单元格的高度乘以行数,因为每个单元格的高度也是动态的。

【问题讨论】:

【参考方案1】:

你可以试试这个

// add observer to your tableView to get its proper height when its 
//data is loaded. you can do this in view did load
 self.YourTableView.addObserver(self, forKeyPath: "contentSize",options: .new, context: nil)

// override this metod to observe for tableView height change
 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
if(keyPath == "contentSize")

    if let newvalue = change?[.newKey]
    
        let newsize  = newvalue as! CGSize
        // make height constraint for your table view and set to new size.
        // and here you can check if newSize.height is more than required tha you can set it to default
        if(newsize.height < defaultHeight)
        self.tableViewHeightConstraint.constant = newsize.height

    else
        self.tableViewHeightConstraint.constant = defaultHeight

    


如果您遇到任何问题,请告诉我

记得移除观察者,否则应用会崩溃

deinit 
 self.YourTableView.removeObserver(self, forKeyPath: "contentSize")
 

【讨论】:

谢谢 Vikky。你救了我的命。 :) 工作完美。【参考方案2】:

您无需手动计算高度,只需使用tableView.contentSize.height

【讨论】:

tableView.contentSize.height 总是不提供正确的高度。所以对于工作解决方案,请参阅我的答案【参考方案3】:

如果你的控制器有很多嵌套滚动视图,tableView.contentSize.height 无法提供实际的 contentHeight。所以如果要获取contentHeight(设置tableview的高度),有两种方法:

    做一个延迟动作:

    DispatchQueue.main.asyncAfter(deadline:DispatchTime.now() + 0.1) // 获取 contentHeight 并设置 tableView`s frame

    在 scrollView 委托中获得正确的高度:

    func scrollViewDidScroll(_ scrollView: UIScrollView) 让 contentHeight = scrollView.contentSize.height

【讨论】:

以上是关于当单元格高度为动态时设置 UITableView 的高度的主要内容,如果未能解决你的问题,请参考以下文章

如何根据动态高度单元格设置 UITableView 的高度约束?

当单元格高度动态更改时,UITableView 出现不自然的混蛋

如何将 UIImage 设置为 UITableView Cell,它根据我在 UILabel 中输入的文本动态计算单元格高度?

UITableView 自定义单元格高度未正确管理 swift 中的动态约束

如何将UIImage设置为UITableView Cell,根据我在UILabel中输入的文本动态计算单元格高度?

UITableView:如何知道 TableView 的所有具有动态单元格高度的单元格何时被调整大小?