单击时如何更改单个单元格的高度?

时间:2014-07-23 18:53:12

标签: ios uitableview swift ios8 xcode6

单击时我必须调整tableView的一行。我怎么能这样做?有人可以帮帮我吗?

我的视图控制器类:

class DayViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var daysWorkPointTable: UITableView

    override func viewDidLoad() {
        super.viewDidLoad()

        var nipName = UINib(nibName: "daysWorkPointsCell", bundle: nil)

        self.daysWorkPointTable.registerNib(nipName, forCellReuseIdentifier: "daysWorkCell")
    }

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

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

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        var cell = tableView.dequeueReusableCellWithIdentifier("daysWorkCell", forIndexPath: indexPath) as daysWorkPointsCell

        return cell
    }

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

    }
}

1 个答案:

答案 0 :(得分:38)

首先,您必须跟踪属性中当前所选单元格的indexPath:

var selectedCellIndexPath: NSIndexPath?

它应该是可选的,因为您无法选择单元格。 接下来,我们可以为选定状态和未选择状态声明高度(将值更改为您想要的任何值):

let selectedCellHeight: CGFloat = 88.0
let unselectedCellHeight: CGFloat = 44.0

现在你必须实施tableView(_:, heightForRowAtIndexPath:)

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if selectedCellIndexPath == indexPath {
        return selectedCellHeight
    }
    return unselectedCellHeight
}

现在,在您的tableView(_:, didSelectRowAtIndexPath:)方法中,您必须检查所选行或未点击的行已被点击:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath {
        selectedCellIndexPath = nil
    } else {
        selectedCellIndexPath = indexPath
    }

    tableView.beginUpdates()
    tableView.endUpdates()

    if selectedCellIndexPath != nil {
        // This ensures, that the cell is fully visible once expanded
        tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .None, animated: true)
    }
}

beginUpdates()endUpdates()来电为您提供动画高度变化。

如果要更改高度变化动画的持续时间,可以将beginUpdates()endUpdates()调用包装在动画块UIView.animationWithDuration(...)中,并将其设置为您想要的任何值。 / p>

您可以查看演示此代码的this sample project