宽高的图像大小适合UITableviewCell无法正确加载

时间:2017-03-09 14:39:21

标签: ios swift uiimageview sdwebimage

我正在使用SDWebImage通过互联网下载图片并显示在TableViewCell。我的图片在下载时不完全适合单元格,但是当我滚动它时,它完全适合。{{{{ 1}}是

cellForRowAtIndexPath

为了在下载时调整大小我正在使用此代码

cell = tableView.dequeueReusableCellWithIdentifier("cell") as! AgentPostTableViewCell

        let str = apiData[indexPath.row].valueForKey("multiple_images")?.objectAtIndex(0) as? String
        cell.agentimage.image = nil
        cell.agentimage.clipsToBounds = true
        if str != nil && str?.isEmpty == false{
            let url = NSURL(string: imageUrl + str!)

            let block: SDWebImageCompletionBlock = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType!, imageURL: NSURL!) -> Void in
                if tableView.visibleCells.contains(cell){
                    cell.setPostedImage(cell.agentimage.image!)
                cell.layoutIfNeeded()
                cell.layoutSubviews()

                }
            }
            cell.agentimage.sd_setImageWithURL(url, placeholderImage: UIImage(named: "o"), completed: block)
            cell.setPostedImage(cell.agentimage.image!)
            print("post image " + imageUrl + str!)
        }

问题是下载时它在视图上不适合但在我正确滚动后适合视图内部。

滚动前

this is the loaded view

在我滚动并返回后,这是视图enter image description here

2 个答案:

答案 0 :(得分:0)

好吧所以我认为你需要让tableview更新。在可以操作的单元格上添加固定的高度约束,然后动态更改它。这是一个例子

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "funCell", for: indexPath) as! FunTableViewCell
    //your url will go here
    let url = URL(string: array[indexPath.row])!
    cell.agentimage.image = nil
    cell.agentimage.sd_cancelCurrentImageLoad()
    cell.agentimage.sd_setImage(with: url, completed: {
        (image, error, cacheType, imageURL) -> Void in
        if image != nil{
            let aspect = image!.size.width / image!.size.height
            //or whatever width you are wanting to constrain it to
            let ourHeight = cell.bounds.width * aspect
            if cell.heightConstraint.constant != ourHeight{
                cell.heightConstraint.constant = ourHeight
                cell.agentimage.image = image
                //most important lines as it would make your constraint work
                tableView.beginUpdates()
                tableView.endUpdates()
            }

        }
    })
    return cell
}

您还可以使用

重新加载特定的索引路径
tableView.reloadRows(at: [indexPath], with: .fade)

对约束的检查非常重要,因为如果不需要重置,则没有理由重置它。另外,为了帮助您平滑,您可以保存图像大小或宽高比的字典,这样您就不必每次都计算。

干杯

答案 1 :(得分:0)

您创建纵横约束但不激活它。

我建议不要使用方面约束并将其替换为图像。 contentMode

我认为您需要使用 scaleAspectFit scaleAspectFill

如果你想使用约束从storyboard创建它,在单元格中创建IBOutlet并在其约束上更改常量。