我正在使用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!)
}
问题是下载时它在视图上不适合但在我正确滚动后适合视图内部。
滚动前
答案 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并在其约束上更改常量。