[英]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.