ios 在swift中首次加载时,未将更改的图像比例应用于tableView单元格

ltskdhd1  于 2023-07-01  发布在  iOS
关注(0)|答案(1)|浏览(98)

我有tableview我显示图像在它与SDWebImage荚。我改变了尺寸后,下载的图像,它的工作良好,但在第一次加载后,在初始加载的尺寸改变不适用。这是我的代码

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reusableCellId) as? FeedTableViewCell
        if feedTableData.count > indexPath.row {
            let rowData = feedTableData[indexPath.row]
            
            
            cell?.feedImage?.sd_setImage(with: URL(string: rowData.poster), completed: { (image, error, cacheType, imageURL) in 
                if let image = image {
                    //cell?.configure(image: image)
                    
                    let hRatio = image.size.height / image.size.width
                    let newImageHeight = hRatio * UIScreen.main.bounds.width
                    cell?.imageHeightContarint?.constant = newImageHeight
                    cell?.feedImage?.image = image
                    cell?.feedImage?.setNeedsLayout()
                    cell?.feedImage?.layoutIfNeeded()

                }
                
        })
            
            //cell?.fillInfo(info: rowData)
        }
        return cell ?? UITableViewCell()
    }
wwwo4jvm

wwwo4jvm1#

当表格视图布局其行/单元格时...

  • heightForRowAt indexPath实现了吗?
  • 使用该值
  • 否则,tableView.rowHeight是否设置为特定值?
  • 使用该值
  • 否则,询问单元格的高度(基于其约束和数据)
  • 使用该值

表格显示后,不再修改行高
所以,如果你的代码改变了单元格的内容,单元格的高度也会改变,我们必须通知控制器,让它重新布局单元格。
对于您的情况-使用来自(我假设)SDWebImagesd_setImage(...),您需要在完成块的末尾通知控制器。
所以:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reusableCellId) as? FeedTableViewCell
    if feedTableData.count > indexPath.row {
        let rowData = feedTableData[indexPath.row]
        
        cell?.feedImage?.sd_setImage(with: URL(string: rowData.poster), completed: { (image, error, cacheType, imageURL) in
            if let image = image {
                //cell?.configure(image: image)
                
                let hRatio = image.size.height / image.size.width
                let newImageHeight = hRatio * UIScreen.main.bounds.width
                cell?.imageHeightContarint?.constant = newImageHeight
                cell?.feedImage?.image = image

                // you shouldn't need either of these lines
                //cell?.feedImage?.setNeedsLayout()
                //cell?.feedImage?.layoutIfNeeded()

                // add this line - it will cause the table view to
                //  re-calculate the row heights
                tableView.performBatchUpdates(nil)
                
            }
            
        })
        
        //cell?.fillInfo(info: rowData)
    }
    return cell ?? UITableViewCell()
}

顺便说一句,你在单元格出队时做了几件不正确的事情(为了摆脱所有那些?),你应该在完成块中使用[weak self]。但这些信息可以通过研究适当的方法来找到。

相关问题