UITableView Cells - 如何使一个单元格的高度固定,其他单元格的高度相对于屏幕大小变化?

时间:2016-05-04 18:41:24

标签: ios swift uitableview height tableviewcell

我有一个带有1个部分的静态UITableView,2个单元格。

我希望'底部'单元格固定高度为70像素,顶部为'可变高度的单元格 - 填补屏幕的平衡。如下:

enter image description here

我有这段代码:

//Modify TableView Cell Heights For Screen Sizes:
var absoluteCellHeights: [CGFloat] = [300, 70] {
    didSet {
        tableView.reloadData()
    }
}

var normalisedCellHeights: [CGFloat]? {
    let totalHeight = absoluteCellHeights.reduce(0) { $0 + $1 }
    let normalisedHeights: [CGFloat]? = totalHeight <= 0 ? nil : absoluteCellHeights.map { $0 / totalHeight }

    return normalisedHeights
}

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

    let height: CGFloat


    if let normalisedHeight = self.normalisedCellHeights?[indexPath.row] {
        height = normalisedHeight * tableView.frame.height
    } else {
        height = 50.0 // Just a random value.
    }

    return height
}

...在我最小的屏幕尺寸目标(3.5英寸)上可以正常工作,其中我为370像素的两个单元格分配了总大小。

但是对于更大的屏幕尺寸,我的总尺寸分配会增加。使用上面的代码,两个单元格将以300:70的相对比率显示。

我希望顶部单元格的大小可以改变为屏幕尺寸 - 屏幕越大,单元格高度越大。但底部单元的大小保持70像素的常数。

有人可以帮忙吗?非常感谢提前。

2 个答案:

答案 0 :(得分:3)

这应该有效:

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

    var height: CGFloat

    if indexPath.row == 1 {
        height = 70.0
    } else {
        height = tableView.frame.height - 70.0
    }

    return height
}

答案 1 :(得分:2)

你的直觉是正确的,你想使用heightForRowAtIndexPath

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if indexPath.row == 1 { return 70 }
    else { return tableView.frame.size.height - 70 }
}

如果这不起作用,请对错误进行评论,我将修改我的答案。