Какой самый простой способ вставить измененные изображения из базовых данных в UICollectionView? - PullRequest
0 голосов
/ 28 сентября 2018

Когда я устанавливаю изображения из локального массива в каждую ячейку представления коллекции, прокрутка запаздывает.Это связано с тем, что при отображении ячейки используется полноразмерный 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 голосов
/ 29 сентября 2018

Я использовал 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
        }
    }
}

Как вы просили для простого Iпосчитал бы, что это сделано.

Если вы хотите потратить больше времени, вы можете / должны подумать о кэшировании (то есть в папку кэша файловой системы).

В зависимости от приложения, может быть, выесть еще один приятный UX способ дать пользователю подсказку о том, что произойдет (т.е. установить правильный (?) цвет заполнителя в качестве фона для изображения перед загрузкой).

С учетом ответа @Bilal для сохранения правильного звука для большого пальцатакже хорошо.Это действительно зависит от вашего приложения, т. Е. От того, есть ли у пользователя выбор изменения размера общего размера изображения в представлении коллекции (сейчас или в будущем).

0 голосов
/ 29 сентября 2018

Вместо изменения размеров изображений во время выполнения вы должны выполнить эту задачу во время сохранения в CoreData.Вместо сохранения одного изображения вы должны сохранить два изображения.Один с полной шкалой (высокое разрешение) и другой миниатюрой (с измененным размером).Загружайте только миниатюры в CollectionViewCell, чтобы избежать задержки прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...