将来自Core Data的调整大小的图像插入UICollectionView的最简单方法是什么?

时间:2018-09-28 20:18:55

标签: ios swift core-data uicollectionview uiimageview

当我将本地数组中的图像设置到每个集合视图单元格中时,滚动会比较缓慢。这是因为将在显示单元格时使用完整比例的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中数组中所有图像的大小会花费大量时间。

这是一个简单的相册应用程序,因此我希望避免使用任何活动或加载指标。 可以访问从Core Data获取的图像数据,如何在集合视图中设置图像,使其在滚动时不会滞后?

2 个答案:

答案 0 :(得分:0)

您应该在保存CoreData时执行此任务,而不是在运行时调整图像大小。而不是保存一张图像,您应该存储两张图像。一种具有完整比例(高分辨率),另一种具有缩略图(调整大小)。仅在您的CollectionViewCell中加载缩略图,以避免滚动滞后。

答案 1 :(得分:0)

我使用了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
        }
    }
}

正如您所要求的那样,我认为它已经完成了。

如果您想花更多的时间,则可以/应该考虑进行缓存(即到文件系统的缓存文件夹)。

根据应用程序的不同,也许您还有另一种不错的UX方式来提示用户将要发生的事情(即,在加载图像之前,将correct(?)占位符颜色设置为图像的背景)。

考虑@Bilal答案以保存正确的拇指版本声音也很好。这实际上取决于您的应用程序,即用户是否可以选择在集合视图(现在或将来的功能)中调整整体图像大小。