【问题标题】:What is the simplest way to insert resized images from Core Data into a UICollectionView?将调整大小的图像从 Core Data 插入 UICollectionView 的最简单方法是什么?
【发布时间】:2019-03-04 20:31:05
【问题描述】:

当我将本地数组中的图像设置到每个集合视图单元格中时,滚动很慢。这是因为在显示单元格时使用的是全尺寸的 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 获取的图像数据,我如何在集合视图中设置图像以使其在滚动时不会滞后?

【问题讨论】:

    标签: ios swift core-data uicollectionview uiimageview


    【解决方案1】:

    我使用了 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 方式来提示用户会发生什么(即在加载之前将正确的 (?) 占位符颜色设置为图像的背景)。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 1970-01-01
        • 2010-10-24
        • 2011-02-09
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        相关资源
        最近更新 更多