我有一个应用程序,使用tableView显示从服务器(类似于Instagram)发送的图像。
从我得到的服务器:
我有一个自定义单元格,可以根据需要显示。
与Instagram一样,图像的高度不固定,因此单元格的高度会动态变化到图像的高度。
我从服务器获取的图像非常大,所以我将每个图像裁剪为Width - Screen's width, Height - Based of the width (keeps the ratio)
,如下所示:
func imageWithImage (sourceImage:UIImage, scaledToWidth: CGFloat) -> UIImage {
let oldWidth = sourceImage.size.width
let scaleFactor = scaledToWidth / oldWidth
let newHeight = sourceImage.size.height * scaleFactor
let newWidth = oldWidth * scaleFactor
UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight))
sourceImage.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
我的问题是tableView非常慢。所以我想到了在后台线程中加载和裁剪图像,并在加载时显示默认图像。
我已经尝试过了(使用像Alamofire
,Kingfisher
之类的SDK等...但是然后单元格的大小(UITableViewAutomaticDimension
)变得一团糟(因为动态高度),滚动时图像变为错误图像,有时甚至在滚动时崩溃。
这就是为什么我在这里问,我如何在后台线程中加载单元格并保持其动态大小,正确的照片并避免崩溃?
非常感谢你先进的答案!
注意:我知道Swift和Objective-C,选择你最喜欢的:)
答案 0 :(得分:1)
我建议使用Alamofire。查看this answer,提供使用Alamofire和自定义解决方案的解决方案。
编辑后评论:
为了根据图像计算单元格高度,您需要在重新加载tableView之前下载并缓存这些图像,因为heightForRowAtIndexPath将在cellForRowAtIndexPath之前调用,因此您需要在实际设置之前知道图像高度细胞的财产。 This answer就是你需要的。