获取UITableView

时间:2016-01-20 12:08:57

标签: ios swift uitableview

有没有办法可以获得UITableView中每行的行高。我有一个UITableView,其中包含动态数据,我正在使用

self.tableView.rowHeight = UITableViewAutomaticDimension

使动态行高。

但是我想改变整体UITableView的高度,因为重新加载数据后我需要所有行的高度。

我尝试使用

self.tableView.layoutIfNeeded()
self.tableViewHeightContraint.constant = self.tableView.contentSize.height

但是由于不明原因,我在UITableView中添加了3或4条记录之后,它给我的身高低于其确切的高度,所以想到了其他方式。计算每行的高度,然后将它们相加。

我正在使用Xcode 7.2,iOS 9和Swift 2

7 个答案:

答案 0 :(得分:1)

var dictionaryOfCellHeight = [Int : CGFloat]()
var dataArray = [String]()
func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {


    if dictionaryOfCellHeight[indexPath.row] == nil
    {
    var frame : CGRect = tableView.rectForRowAtIndexPath(indexPath)

        if indexPath.row == dataArray.count
        {

            dictionaryOfCellHeight[indexPath.row] = frame.size.height
            //calculate total height and reload table
        }
        else
        {
        dictionaryOfCellHeight[indexPath.row] = frame.size.height
        }

    }
}

答案 1 :(得分:1)

在Swift 3.0中

让myRowHeight = yourTableView.rowHeight

答案 2 :(得分:0)

要更改Tableview的高度,您不需要计算所有UITableViewCell的高度并设置为TableView。 在height方法中正确设置每个UITableViewCell的{​​{1}}。这会自动将可滚动高度设置为heightForRowAtIndexPath

答案 3 :(得分:0)

您可以使用此

CGRect frame = [tableView rectForRowAtIndexPath:indexPath];
NSLog(@"row height : %f", frame.size.height);

使用frame.size.height可以获得特定行的高度

答案 4 :(得分:0)

这是因为self.tableView.contentSize.height返回行数* estimatedRowHeight,这不等于表视图的实际高度。你需要的是通过visibleCells获得单个单元格高度,然后将它们相加以获得表格视图的高度。

请参阅此答案: https://stackoverflow.com/a/40081129/4076956

答案 5 :(得分:0)

表格可能没有调整其内容的大小,因此如果您尝试使用[self. tableView layoutSubviews];来强制调整大小,则可能会有效。 [self. tableView layoutIfNeeded];不一定会强制更新。

答案 6 :(得分:0)

功能上(单行)

注意:我的section数组存储.data var

中的行
let heightOfAllRows:CGFloat = sections.enumerated().map { arg -> [(section:Int,row:Int)] in
            return arg.element.data.indices.map{ i in
                (section:arg.offset,row:i)
            }
        }.flatMap{$0}.reduce(0){
            return $0 + self.tableView(self, heightForRowAt: .init(row: $1.row, section: $1.section))
        }