>当我将本地数组中的图像设置到每个集合视图单元格中时,滚动很滞后。 这是因为在显示单元格时正在使用全比例的 UIImage。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCell", for: indexPath) as! PhotoCell
let image = images[indexPath.row]
cell.imageView.image = image
return cell
}
为了尝试解决这个问题,我编写了一个在运行时将图像大小调整为适当大小的方法。
private func resizeImages(images: [UIImage], size: CGSize) -> [UIImage?] {//...}
但是在viewDidLoad
中调整数组中所有图像的大小需要花费相当长的时间。
这是一个简单的相册应用程序,所以我宁愿避免使用任何活动或加载指示器。如果可以访问从核心数据获取的图像数据,如何在集合视图中设置图像,使其在滚动时不会滞后?
与其在运行时调整图像大小,不如在保存时执行此任务CoreData
.您应该存储两个图像,而不是保存一个图像。一个具有全比例(高分辨率(和其他缩略图(调整大小(。在CollectionViewCell
中仅加载缩略图以避免滚动滞后。
我使用了LazyImageView(最初取自 cocoanetics.com(进行网络,它可能无需进行太多更改即可工作:
import UIKit
class LazyImageView: UIImageView {
var loading = false
weak var rawImage: UIImage?
deinit {
image = nil
loading = false
}
override func didMoveToSuperview() {
if !loading && image == nil{
loading = true
DispatchQueue.global().async {
self.resizeImage()
}
}
}
func resizeImage() {
let resizedImage: UIImage? = nil
// do the resizing
DispatchQueue.main.async {
self.image = resizedImage
self.loading = false
}
}
}
正如你要求简单的那样,我会认为它已经完成了。
如果你想花更多的时间,你可以/应该考虑缓存(即缓存到文件系统的缓存文件夹(。
根据应用程序的不同,也许您有另一种不错的用户体验方式来提示用户将会发生什么(即在加载之前将正确的(?(占位符颜色设置为图像的背景(。
考虑@Bilal答案来保存正确的拇指版本的声音也很好。这实际上取决于您的应用程序,即用户是否可以选择在集合视图中调整整体图像大小(现在或作为将来的功能(。