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

时间:2016-07-18 09:38:34

标签: swift

我想动态更改单元格的高度,使图像以宽度填充imageView,图像保持纵横比。

我正在尝试使用UITableViewAutomaticDimension执行此操作。根据在线提供的教程,这似乎是一项简单的任务。但在我的情况下,单元格的高度不会调整以执行此任务。图像填充宽高比会留下大量宽度空间或填充宽度但会垂直剪切图像的一部分。我确保在单元格视图方面存在前导,尾随,顶部和底部约束,并且在viewDidLoad中设置了tableView.rowHeight = UITableViewAutomaticDimension和table.estimatedRowHeight。我已在此链接上传了该项目。有人可以建议我在这里可以缺少什么?

Link to GitHub

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


@IBOutlet weak var picTableView: UITableView!

let reuseidentifier = "dynamicCellTableViewCell"
let images = [UIImage(named: "feedImage1"), UIImage(named: "feedImage2"), UIImage(named: "feedImage3")]

override func viewDidLoad() {
    super.viewDidLoad()

picTableView.rowHeight = UITableViewAutomaticDimension
picTableView.estimatedRowHeight = 1000
}

// MARK: Table View Data Source

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return images.count
}

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

    cell.displayImageView.image = images[indexPath.row]

    return cell
}



}

3 个答案:

答案 0 :(得分:2)

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

所以诀窍是首先改变图像的宽度和高度,以匹配单元格中所需的宽度和高度。其余的工作将由UITableViewAutomaticDimension完成。下面是现在可以使用的更新的cellForRowAtIndex函数。感谢所有人提供的意见。

    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
}

答案 1 :(得分:0)

您需要为UITableViewController实现next方法:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 1000.0;
}

在方法中,您必须知道每个单元格的维度。你必须事先知道每个细胞的高度。

例如,您可以创建一个CGFloat数组,保存高度将包含每一行,当高度更改时,您可以在数组中更新此位置并执行tableView.reloadData()。

var arrayHeight:CGFloat?
//Now fill array with height of each cell

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return arrayHeight[indexPath.row];
}

答案 2 :(得分:0)

<强> cell.updateConstraintsIfNeeded()

<强> cell.setNeedsUpdateConstraints()

在cellForRowAtIndexPath委托方法

中添加这两行

确保在故事板中设置了top,bottom,right,left约束