自定义 UITableView 单元格图像转换未应用于可重用单元格

Posted

技术标签:

【中文标题】自定义 UITableView 单元格图像转换未应用于可重用单元格【英文标题】:Custom UITableView cell image transform not applied to reusable cells 【发布时间】:2019-08-27 06:07:28 【问题描述】:

我有一个自定义 UITableViewCell,它在左侧显示一个圆形图像。由于 UITableViewCell 提供的默认 UIImageView 与行的高度相同,因此图像最终几乎接触。我想稍微缩小图像以创建一些额外的填充。

我能够使用以下代码使其工作

override func layoutSubviews() 
    super.layoutSubviews()

    // Make the image view slightly smaller than the row height
    self.imageView!.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)

    // Round corners
    self.imageView!.layer.cornerRadius = self.imageView!.bounds.height / 2.0
    self.imageView!.layer.borderWidth = 0.5
    self.imageView!.layer.borderColor = UIColor.gray.cgColor
    self.imageView!.layer.masksToBounds = true
    self.imageView!.contentMode = .scaleAspectFill;

    self.updateConstraints()


override func prepareForReuse() 
    super.prepareForReuse()
    self.imageView!.image = nil
    self.layoutSubviews()

这仅适用于表格视图中首次出现在屏幕上时显示的单元格。一旦我滚动(即出列可重复使用的单元格),就不再应用转换。下图显示了表格视图的左侧。我已经捕获了原始单元格转换为重复使用单元格的区域。

为了完整起见,这是我的 tableView(cellForRowAt:) 函数

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = self.itemTableView.dequeueReusableCell(withIdentifier: "ItemCell") as! InventoryItemTableViewCell

    if let items = self.displayedItems 
        if indexPath.row < items.count 
            let item = items[indexPath.row]

            cell.item = item
            cell.textLabel!.text = items[indexPath.row].partNumber
            cell.detailTextLabel!.text = items[indexPath.row].description

            if let quantity = items[indexPath.row].quantity 
                cell.quantityLabel.text = "Qty: \(Int(quantity))"
            
            else 
                cell.quantityLabel.text = "Qty: N/A"
            

            if let stringImageBase64 = item.imageBase64 
                let dataDecoded: Data = Data(base64Encoded: stringImageBase64, options: .ignoreUnknownCharacters)!
                cell.imageView!.image = UIImage(data: dataDecoded)
            
            else 
                cell.imageView!.image = blankImage
            
        
    

    return cell

我尝试了其他方法,例如使用图像视图的插图,但没有效果。

问题

为什么在创建表格时将转换应用于原始单元格,而不应用于任何重复使用的单元格?我应该以不同的方式处理这个问题吗?

【问题讨论】:

重用cell时是否调用layoutSubviews? 【参考方案1】:

我能够使用以下代码来调整图像大小。似乎自动布局是在转换之后应用的,因此会覆盖它。

    override func layoutSubviews() 
        // Layout all subviews except for the image view
        super.layoutSubviews()

        // Make the image view slightly smaller than the row height
        self.imageView!.frame = CGRect(x: self.imageView!.frame.origin.x + 4,
                                       y: self.imageView!.frame.origin.y + 4,
                                       width: 56,
                                       height: 56)

        // Round corners
        self.imageView!.layer.cornerRadius = self.imageView!.frame.height / 2.0
        self.imageView!.layer.borderWidth = 0.5
        self.imageView!.layer.borderColor = UIColor.gray.cgColor
        self.imageView!.layer.masksToBounds = false
        self.imageView!.clipsToBounds = true
        self.imageView!.contentMode = .scaleAspectFit;
    

【讨论】:

以上是关于自定义 UITableView 单元格图像转换未应用于可重用单元格的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 错误的图像加载了自定义单元格和 UIView

UITableView 中的自定义单元格使图像在滚动时重叠

在uitableview中选择时如何更改自定义单元格图像和标签字体颜色?

Xcode UITableView 自定义单元格xib 图像高度

如何在自定义单元格的 initWithStyle: 方法中获取 UITableView 的宽高?

带有自定义单元格的 UITableView