0

我正在尝试从服务器下载图像并想在我的单元格中加载图像,但是当我在 cellForRowAt 方法中下载时,它不会第一次获得高度。如果我向上滚动并再次向下滚动,图像将具有适当的高度。

使用 Kingfisher 从服务器下载图像

var homeList = [NSDictionary]()
var rowHeights : [Int:CGFloat] = [:]

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

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

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        if let height = self.rowHeights[indexPath.row]{
            print(" Height \(height)")
            return height
        }
        else{
            return 160
        }
}


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


    if let homeObject = homeList[safe: indexPath.row] {
        if let dynamicURL =  homeObject["dynamic_card_url"] as? String, dynamicURL != "" {

            tableView.register(UINib(nibName: "DynamicCell", bundle: nil), forCellReuseIdentifier: "\(indexPath.row)")
            let cell = tableView.dequeueReusableCell(withIdentifier: "\(indexPath.row)", for: indexPath) as! DynamicCell

            KingfisherManager.shared.downloader.downloadImage(with: URL(string: dynamicURL)!, options: .none, progressBlock: nil, completionHandler: { (image, error, url, data) in
                DispatchQueue.main.async {

                    if (image != nil || url != nil){
                    let aspectRatio = (image! as UIImage).size.height/(image! as UIImage).size.width
                    cell.dynamicImageView.image = image
                    let imageHeight = self.view.frame.width*aspectRatio
                    self.rowHeights[indexPath.row] = imageHeight
                    }else{
                        print("Image or URL is nil")
                    }
                }
            })
            cell.selectionStyle = .none
            cell.backgroundColor = UIColor.clear
            return cell       
    }
}
}
4

2 回答 2

0

我使用了这个家伙的建议:https ://stackoverflow.com/a/33499766/8903213

代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.imageView?.kf.setImage(with: URL(string: urlOfPhoto)!, placeholder: PlaceholderImages.user, completionHandler: {
         (image, error, cacheType, imageUrl) in
         cell.layoutSubviews()
    })
    ...

这似乎对我有用。

于 2018-01-03T17:36:07.183 回答
0

下载图像后,您应该重新加载单元格以将其大小更改为适当的大小。滚动时您会获得正确的尺寸,因为 tableViewheightForRowAt在需要显示新单元格时会调用。所以在DispatchQueue.main.async {设置所有必要的属性后重新加载单元格UITableView().reloadRows(at: [IndexPath], with: UITableViewRowAnimation.automatic)

于 2017-11-03T19:14:39.997 回答