如何动态更改UITableView中单元格的高度?

时间:2015-08-21 08:46:10

标签: ios swift uitableview

我有:

UITableView

中的UIViewcontroller

var searchResults: UITableView = UITableView();

自定义UITableViewCell课程:

class CellSearchResult: UITableViewCell { ... }

我为tableview注册了我的单元格:

searchResults.registerClass(CellSearchResult.self, forCellReuseIdentifier: "Cell");

我有我的tableView方法来填充我的表:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CellSearchResult
    cell.frame.height = 100;   <<<< ERROR

    ...
}

我想更改单元格的高度,如:

cell.frame.height = 100;   <<<< ERROR

怎么做?

4 个答案:

答案 0 :(得分:4)

您需要覆盖heightForRowAtIndexPath功能。例如:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 100
    }

修改

如果您不是UITableViewController的子类,则除非符合UITableViewDelegateUITableViewDataSource协议,否则无法访问tableView函数。你可以通过

来做到这一点
class myViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { ....

  tableview.delegate = self
  tableview.datasource = self

答案 1 :(得分:1)

如果所有单元格的高度相同,则最有效的方法是设置UITableView本身的rowHeight属性。

tableView.rowHeight = 100.0
  

使用会对性能产生影响   tableView:heightForRowAtIndexPath:而不是rowHeight。每一次   显示表视图,它调用tableView:heightForRowAtIndexPath:   在每个行的委托上,这可能导致一个   表视图具有大量的重要性能问题   行(大约1000或更多)。

如果单元格具有可变高度,则需要实现UITableViewDelegate方法tableView:heightForRowAtIndexPath:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    var height = // do something to calculate height

    return height
}

如果您需要在tableView:heightForRowAtIndexPath:中进行昂贵的计算,建议您实施另一种UITableViewDelegate方法,tableView:estimatedHeightForRowAtIndexPath:(自iOS 7起可用)。您在此方法中添加的任何代码都需要高效。

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 100.0
}
  

提供估计行的高度可以改善用户   加载表视图时的体验。如果表包含变量   高度行,计算所有高度可能是昂贵的   因此导致更长的加载时间。使用估计允许您推迟   从加载时间到滚动的几何计算的一些成本   时间。

答案 2 :(得分:1)

您必须实现以下操作才能在运行时增加特定的行高而不调用reloadData()

增加第10行高度的示例:

 rowHightUpdateReqd = true
 tableView.beginUpdates()
 tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 10, inSection: 0)], withRowAnimation: UITableViewRowAnimation.Fade)
 tableView.endUpdates()

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

   var rowHight: CGFloat = 50

   if rowHightUpdateReqd == true{
      rowHight = 100
      rowHightUpdateReqd = false
   }
   return rowHight
}

答案 3 :(得分:0)

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
 return 100.0;   
}