Swift - 根据图片宽高比动态调整UITableViewCell大小

9

我正在尝试创建动态大小的UITableViewCells,根据从服务器下载的图像的纵横比来更改高度。

例如,如果图像的高度是其宽度的两倍,则希望UITableViewCell的高度为屏幕宽度的两倍,以便图像可以占据整个屏幕宽度并保持纵横比。

我的做法是在单元格中添加约束,并使用UITableViewAutomaticDimension计算高度,但我面临的问题是,在下载图像之前无法知道其纵横比,因此单元格开始很小,然后手动刷新tableView后,单元格才会呈现正确的大小。

我也不认为每次下载图像时重新加载每个单元格是一个好方法。

这种方法是最好的吗?我想不出其他方法来做到这一点,因为当初始化单元格时,无法从单元格本身中获得其纵横比。


你可以将图片的宽度和高度发送到服务器,然后在返回时,可以根据图片给出单元格的宽度和高度。 - Jitendra Modi
1个回答

18
为了实现这个目标,我首先使用一个字典[Int:CGFloat]来存储计算出的单元格高度,然后在heightForRowAtIndexpath方法中使用字典中保存的值,在cellForRowAtIndexpath方法中,您应该下载您的图像,计算宽高比,将您的单元格宽度或图像宽度乘以您的宽高比,并将计算出的高度放入对应的IndexPath号码中的字典中。
在代码中,类似于这样的东西,这是一个使用Alamofire加载图像的示例代码。
    var rowHeights:[Int:CGFloat] = [:] //declaration of Dictionary


    //My heightForRowAtIndexPath method
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if let height = self.rowHeights[indexPath.row]{
            return height
        }else{
            return defaultHeight
        }
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

if let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCell") as? ImageCell
        {
        let urlImage = Foundation.URL(string: "http://imageurl")
        cell.articleImage.af_setImage(withURL: urlImage, placeholderImage: self.placeholderImage, filter: nil, imageTransition: .crossDissolve(0.3), completion: { (response) in

            if let image = response.result.value{
                DispatchQueue.main.async {

                    let aspectRatio = (image! as UIImage).size.height/(image! as UIImage).size.width
                    cell.articleImage.image = image
                    let imageHeight = self.view.frame.width*aspectRatio
                    tableView.beginUpdates()
                    self.rowHeights[indexPath.row] = imageHeight
                    tableView.endUpdates()

                }
            }
        })
        }

我希望这可以帮到你


2
我尝试了你的解决方案,但是当我滚动时,我的表格视图会跳动...你能帮忙吗,@Reinier? - Abhijit Hadkar
我的tableview.content.size在滚动时会发生变化,这导致了卡顿的行为。 - Abhijit Hadkar
@AbhijitHadkar,你能发一个视频链接或其他什么东西吗? - Reinier Melian
没有tableview.beginupdates()和tableview.endupdates(),它可以在没有弹跳的情况下正常工作。 - Abhijit Hadkar
好的,@AbhijitHadkar 我会尽快审核它,感谢您的反馈。 - Reinier Melian
Yes please do Thanks - Abhijit Hadkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接