簡體   English   中英

將來自Core Data的調整大小的圖像插入UICollectionView的最簡單方法是什么?

[英]What is the simplest way to insert resized images from Core Data into a UICollectionView?

當我將本地數組中的圖像設置到每個集合視圖單元格中時,滾動就很麻煩。 這是因為將在顯示單元格時使用完整比例的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獲取的圖像數據,如何在集合視圖中設置圖像,以使其在滾動時不會滯后?

除了在運行時調整圖像大小外,還應該在保存到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
        }
    }
}

正如您所要求的那樣,我認為它已經完成。

如果您想花更多的時間,則可以/應該考慮進行緩存(即到文件系統的緩存文件夾)。

根據應用程序的不同,也許您還有另一種不錯的UX方法可以向用戶提示將要發生的事情(即,在加載之前將正確的(?)占位符顏色設置為圖像的背景)。

考慮@Bilal答案以保存正確的拇指版本聲音也很好。 這實際上取決於您的應用程序,即用戶是否可以選擇在集合視圖(現在或將來的功能)中調整整體圖像大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM