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

时间:2017-12-14 05:35:37

标签: ios uitableview swift3

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

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

3 个答案:

答案 0 :(得分:1)

您无需手动计算高度,只需使用 expect { #put your code here }.to raise_error

答案 1 :(得分: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

    }
}
}

如果您遇到任何麻烦,请告诉我

请记住删除观察者否则app会崩溃

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

答案 2 :(得分:1)

如果您的控制器有许多嵌套scrollView, tableView.contentSize.height 无法提供实际的contentHeight。因此,如果您想获取contentHeight(设置tableview的高度),有两种方法:

  1. 做一个延迟行动:
      

    DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now()+ 0.1){
                     //获取contentHeight并设置tableView的框架
                 }

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

    func scrollViewDidScroll(_ scrollView:UIScrollView){
                 let contentHeight = scrollView.contentSize.height
    }}