Ios 静态表格视图单元格调整高度、填充视图高度

Ios 静态表格视图单元格调整高度、填充视图高度,ios,objective-c,uitableview,swift,Ios,Objective C,Uitableview,Swift,我的应用程序需要一些uitableview可以简化的事情。但我遇到了这个问题:我希望底部单元格始终位于视图控制器的底部,并且我希望所有单元格动态调整其高度,使每个单元格都位于视图控制器内,无需滚动即可看到更多单元格 基本上,我想要3或4个大的TableViewCell,它们都会根据所使用的设备动态地改变高度。警告:所有这些细胞都需要有不同的高度。有什么想法吗?您可以重写UITableViewDelegate方法,并基于indepath - (CGFloat)tableView:(UI

我的应用程序需要一些uitableview可以简化的事情。但我遇到了这个问题:我希望底部单元格始终位于视图控制器的底部,并且我希望所有单元格动态调整其高度,使每个单元格都位于视图控制器内,无需滚动即可看到更多单元格


基本上,我想要3或4个大的TableViewCell,它们都会根据所使用的设备动态地改变高度。警告:所有这些细胞都需要有不同的高度。有什么想法吗?

您可以重写
UITableViewDelegate
方法,并基于
indepath

-       (CGFloat)tableView:(UITableView *)tableView 
   heightForRowAtIndexPath:(NSIndexPath *)indexPath

在这个委托方法中,只需返回UITableView的高度除以UITableView中的行数即可

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
    return tableView.frame.size.height / tableView.numberOfRowsInSection(0)
}

(0)假定表视图中只有一个节

扩展@Vig的评论:

您没有指定单元格高度是如何确定的,因此我假设它们没有在0和1之间标准化

因此,在
UITableViewController
中,需要以下变量:

在我的示例中,我使用
absoluteCellHeights
作为确定单元格高度的数据,这需要根据您的目的进行更改

var absoluteCellHeights: [CGFloat] = [50, 40, 20, 10] {
    didSet {
        tableView.reloadData()
    }
}
normalisedCellHeights
获取
absoluteCellHeights
并将其缩放为0到1的间隔。但是,如果
absoluteCellHeights
刚好满了零,则返回nil

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

    return normalisedHeights
}
最后,由于不希望表格滚动,因此在配置表格视图时需要添加
tableView.scrollEnabled=false
。如果你使用故事板,可能是IB

最终结果是:


我会使用-tableView:heightForRowAtIndexPath:和view.frame.size.height来计算每个单元格的高度。您确实可以为您的单元格设置动态高度。您可以始终使用%逻辑来计算高度。例如,cell1 25%的视图cell2 50%的cell3 10%和cell4 15%的框架高度,但根据设备的不同而有所不同,除非您期望3到4个单元中的每个单元都具有潜在的独特高度。非常棒的深度解释。感谢您的帮助,我刚刚更新了我的答案,添加了
absoluteCellHeights
可能只包含零的事件。但是干杯!我很高兴能帮上忙。极好的解释和回答。谢谢
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    //  Swift 1.2, which is why I'm using 'let' here.
    let height: CGFloat

    //  It is assumed there is only one section.
    if let normalisedHeight = self.normalisedCellHeights?[indexPath.row] {
        height = normalisedHeight * tableView.frame.height
    } else {
        height = 50.0 // Just a random value.
    }

    return height
}