一尘不染

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

swift

单击时,我必须调整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!) {

    }
}

阅读 200

收藏
2020-07-07

共1个答案

一尘不染

首先,您必须跟踪属性中当前选定单元格的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(...),并将其设置为所需的任何值。

您可以签出演示该代码的示例项目

2020-07-07