Swift 使用UITableViewAutomaticDimension动态更改图像的tableViewCell高度

Swift 使用UITableViewAutomaticDimension动态更改图像的tableViewCell高度,swift,Swift,我想动态更改单元格的高度,这样图像在宽度上填充imageView,并且图像保持纵横比 我正试图使用UITableViewAutomaticDimension来实现这一点。根据在线提供的教程,这似乎是一项简单的任务。但在我的例子中,单元格的高度不能调整以执行此任务。要么用纵横比填充图像,留下大量空白宽度空间,要么填充宽度,但垂直剪裁图像部分。我确保单元格视图以及在viewDidLoad中设置的tableView.rowHeight=UITableViewAutomaticDimension和tab

我想动态更改单元格的高度,这样图像在宽度上填充imageView,并且图像保持纵横比

我正试图使用
UITableViewAutomaticDimension
来实现这一点。根据在线提供的教程,这似乎是一项简单的任务。但在我的例子中,单元格的高度不能调整以执行此任务。要么用纵横比填充图像,留下大量空白宽度空间,要么填充宽度,但垂直剪裁图像部分。我确保单元格视图以及在viewDidLoad中设置的
tableView.rowHeight=UITableViewAutomaticDimension
和table.EstimatedRoight都有前导、尾随、顶部和底部约束。我已经上传了这个链接的项目。有人能告诉我我在这里遗漏了什么吗


您需要为UITableViewController实现下一个方法:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 1000.0;
}
在方法内部,您必须知道每个单元格的维度。您必须提前知道每个单元格的高度

例如,您可以创建一个CGFloat数组,保存每行的高度,当高度发生变化时,您可以在数组和Execute tableView.reloadData()中更新此位置


您需要为UITableViewController实现下一个方法:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 1000.0;
}
在方法内部,您必须知道每个单元格的维度。您必须提前知道每个单元格的高度

例如,您可以创建一个CGFloat数组,保存每行的高度,当高度发生变化时,您可以在数组和Execute tableView.reloadData()中更新此位置


cell.updateConstraintsIfNeeded()

cell.setNeedsUpdateConstraints()

在cellForRowAtIndexPath委托方法中添加这两行


并确保在情节提要单元格中设置了上、下、右、左约束。updateConstraintsIfRequired()

cell.setNeedsUpdateConstraints()

在cellForRowAtIndexPath委托方法中添加这两行


并确保在故事板中设置了顶部、底部、右侧、左侧约束

我找到了解决方案。UIImageView与UITableViewAutomaticDimension一起使用时,仅查找UIImage的真实宽度和高度作为大小。因此,UIImageView调整其高度以响应UIImage的原始高度,而不是缩放宽度(aspectFit)的缩放高度以匹配布局约束

所以诀窍是首先更改图像的宽度和高度,以匹配单元格中所需的宽度和高度。其余工作将由UITableViewAutomaticDimension完成。下面是更新后的CellForRowatinex函数,该函数现在可以使用了。感谢大家的投入

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseidentifier, forIndexPath: indexPath) as! DynamicCellTableViewCell

    let image = images[indexPath.row]!
    let newWidth = cell.displayImageView.frame.width
    let scale = newWidth/image.size.width
    let newHeight = image.size.height * scale
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    cell.displayImageView.image = newImage

    return cell
}

我想出了解决办法。UIImageView与UITableViewAutomaticDimension一起使用时,仅查找UIImage的真实宽度和高度作为大小。因此,UIImageView调整其高度以响应UIImage的原始高度,而不是缩放宽度(aspectFit)的缩放高度以匹配布局约束

所以诀窍是首先更改图像的宽度和高度,以匹配单元格中所需的宽度和高度。其余工作将由UITableViewAutomaticDimension完成。下面是更新后的CellForRowatinex函数,该函数现在可以使用了。感谢大家的投入

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseidentifier, forIndexPath: indexPath) as! DynamicCellTableViewCell

    let image = images[indexPath.row]!
    let newWidth = cell.displayImageView.frame.width
    let scale = newWidth/image.size.width
    let newHeight = image.size.height * scale
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    cell.displayImageView.image = newImage

    return cell
}

在您的情况下,是否只需要使用UITableViewAutomaticDimension?我的意思是,还有其他解决方案吗?谢谢你的回复。是的,我正在尝试实现UITableViewAutomaticDimension,它似乎是为此类应用程序设计的。我试图按照这个教程,但似乎无法让它工作。如果这不起作用,我将尝试实现此平台上已经存在的其他解决方案。在您的情况下,是否只需要使用UITableViewAutomaticDimension?我的意思是,还有其他解决方案吗?谢谢你的回复。是的,我正在尝试实现UITableViewAutomaticDimension,它似乎是为此类应用程序设计的。我试图按照这个教程,但似乎无法让它工作。如果这不起作用,我将尝试实现这个平台上已经存在的其他解决方案。谢谢。如果我必须自己提供每个单元格的确切高度,那么UITableViewAutomaticDimension有什么用?谢谢。如果我必须自己提供每个单元格的确切高度,那么UITableViewAutomaticDimension有什么用?谢谢。我也试过了,但没用。我有四个必要的约束条件。这是我正在使用的项目,以防你能找到我犯的任何其他愚蠢的错误。我在文件中做了一些更改linkhttps://github.com/Neeraj3pathi/SimpleDrawing/issues/2 请检查Arvind,我下载了你的项目并检查了。添加的较大图像会将该单元格的总高度增加到图像的总高度。但是,它会根据自动布局约束来调整图像的外观,从而在该单元格的顶部和底部留下巨大的空白空间。你没有面对那个问题吗?谢谢。我也试过了,但没用。我有四个必要的约束条件。这是我正在使用的项目,以防你能找到我犯的任何其他愚蠢的错误。我在文件中做了一些更改linkhttps://github.com/Neeraj3pathi/SimpleDrawing/issues/2 请检查Arvind,我下载了你的项目并检查了。添加的较大图像会将该单元格的总高度增加到图像的总高度。但是,它会根据自动布局约束来调整图像的外观,从而在该单元格的顶部和底部留下巨大的空白空间。你没有面对那个问题吗?