iOS中的HeightForRowAt和estimatedHeightForRowAt

时间:2018-08-27 07:22:05

标签: ios swift uitableview

我在一个ViewController中有2个tableview。两个tableview的单元格高度都不同。

在第一个表格视图中,我是通过 heightForRowAt 委托方法进行计算的,因为在该表格中,单元格的内容是静态的。第二个通过 estimatedHeightForRowAt 委托方法,因为在该表中,单元格的内容是文本(可以是大或小)。

因此问题出在第二个表格视图的单元格高度固定为58。在显示大文本时,该值没有增加。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if tableView == tblHistory{
        let h = ((tableView.frame.size.width - 16) * 7 / 5) + 74
        return h
    }
    else{
        return 58
    }
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    if tableView == tblHistory{
        let h = ((tableView.frame.size.width - 16) * 7 / 5) + 74
        return h
    }
    else{
        return 58
    }
}

注意:我已经正确设置了所有限制条件,以根据文本调整单元格高度。

3 个答案:

答案 0 :(得分:2)

  

问题是文本单元格的高度固定。大文本显示时并没有增加。

您确实必须在情节提要的单元格中的约束方面具有完美的表现。

真的有很多事情要知道。您将必须显示(截屏)单元的情节提要,并显示链接<DataGrid x:Name="datagrid_software" Margin="5" Grid.Row="1" > <DataGrid.Columns> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Application" Width="*"/> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Editeur" Width="Auto"/> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Installé le" Width="Auto"/> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Localisation" Width="*"/> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Taille" Width="Auto"/> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Version" Width="Auto"/> <DataGridCheckBoxColumn Binding="{x:Null}" ClipboardContentBinding="{x:Null}" Header="Uninstall" Width="*"/> </DataGrid.Columns> </DataGrid> 和其他项目的所有垂直约束。

通常来说,您不应该“固定” UILabel的高度,也不应该“固定” UILabel的整体“链”。如果操作正确,则隐式高度将起作用。

答案 1 :(得分:1)

如果约束设置正确,则无需计算高度。只需为两个表视图返回UITableViewAutomaticDimension

答案 2 :(得分:-1)

最佳解决方案是使用 heightForRowAt 中的相同方法计算两个文本的高度:

func heightForText(string: String, width: CGFloat, font: UIFont) -> CGFloat {
    let attrString = NSAttributedString(
        string: string,
        attributes: [NSFontAttributeName: font])
    let size = attrString.boundingRect(
    with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude), 
    options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil)
    return size.height
}