更改特定动态原型单元的高度

时间:2019-05-13 20:43:34

标签: ios swift

我有一个动态的原型表视图。此表视图显示结构数组。每个结构都由两个单元格表示,准确的用DateCelltimelineCell表示。

在这种情况下,日期单元格是标题,并添加了func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

我希望表视图(数组的第一个索引)顶部的DateCell(HeaderCell)具有不同的外观。我已经弄清楚了如何更改此标题的背景等(请参见viewForHeaderInSection),但是如何更改此单元格的高度?

extension TimelineViewController: UITableViewDataSource, UITableViewDelegate {

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

    func numberOfSections(in tableView: UITableView) -> Int {
        return addDataArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let rowData = addDataArray[indexPath.section]

        let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell") as! TimelineCell

        cell.setDrivenKm(drivenKm: rowData.driven)
        cell.setConsumedL(consumedL: rowData.consumedL)
        cell.setPricePerLiter(pricePerLiter: rowData.pricePerLiter)

        return cell
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let rowData = addDataArray[section]
        guard let last = addDataArray.first else { return nil }
        let color: UIColor!

        let headerCell = tableView.dequeueReusableCell(withIdentifier: "DateCell") as! DateCell

        if rowData.date == last.date {
            color = UIColor.white
            headerCell.backgroundColor = UIColor(red: 0/255, green: 22/255, blue: 60/255, alpha: 1)
        } else {
            color = UIColor(red: 0/255, green: 22/255, blue: 60/255, alpha: 1)
        }

        headerCell.setDate(date: rowData.date, color: color)

        return headerCell
    }

}

2 个答案:

答案 0 :(得分:0)

您需要实现(对于静态)

func tableView(_ tableView: UITableView, 
   heightForHeaderInSection section: Int) -> CGFloat {
    return 100.0
}

动态

self.tableView.estimatedSectionHeaderHeight = 100.0
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

并确保您的约束正确地挂在单元格,顶部,顶部,底部和底部

答案 1 :(得分:0)

尽管前面的答案是正确的,但是如果您在本节中只有两个项目(标头和单元格),并且在实现中这两个项目都是UITableViewCell的子类,那么您可以在cellForRowAt方法。只需将numberOfRowsInSection中的数字增加到2,然后切换indexPath.row

extension TimelineViewController: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return addDataArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch indexPath.row {
        case 0:
            let rowData = addDataArray[section]
            guard let last = addDataArray.first else { return UITableViewCell() }
            let color: UIColor!

            let headerCell = tableView.dequeueReusableCell(withIdentifier: "DateCell", for: indexPath) as! DateCell

            if rowData.date == last.date {
                color = UIColor.white
                headerCell.backgroundColor = UIColor(red: 0/255, green: 22/255, blue: 60/255, alpha: 1)
            } else {
                color = UIColor(red: 0/255, green: 22/255, blue: 60/255, alpha: 1)
            }

            headerCell.setDate(date: rowData.date, color: color)

            return headerCell
        case 1:
            let rowData = addDataArray[indexPath.section]

            let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell", for: indexPath) as! TimelineCell

            cell.setDrivenKm(drivenKm: rowData.driven)
            cell.setConsumedL(consumedL: rowData.consumedL)
            cell.setPricePerLiter(pricePerLiter: rowData.pricePerLiter)

            return cell
        default:
            return UITableViewCell()
        }
    }

}

但是,如果您确实要使用节标题,则可以使用UITableViewHeaderFooterView的子类作为标题。