У меня есть UICollectionViewCell с 1-3 UIImageView, которые управляются stackView.
Все изображения имеют около 8 МБ.Я загружаю их асинхронно из CoreData перед вызовом collectionView.reload ()
. В этой настройке представление коллекции замирает при перемещении при загрузке новых ячеек.
Я пробовал это с меньшими изображениями, а затем неfreeze.
Теперь я уменьшаю изображения до их загрузки в UIImageView.Но это приводит к другому странному поведению, например, сначала показать картинку из другой ячейки, а затем добавить правильные.
override func configureCellAtIndexPath(item: Journaling) {
super.configureCellAtIndexPath(item: item)
let imageOne = UIImageView()
let imageTwo = UIImageView()
let imageThree = UIImageView()
imageContainer = nil
imageOne.image = nil
imageTwo.image = nil
imageThree.image = nil
if item.image.count == 1 {
let group = DispatchGroup()
group.enter()
var downsizedImage = [UIImage]()
DispatchQueue.global().async {
downsizedImage.append(item.image[0].downsizeImage(.low)!)
group.leave()
}
group.notify(queue: .main) {
imageOne.image = downsizedImage[0]
imageTwo.image = nil
imageThree.image = nil
self.setUpStackView([imageOne])
}
}
if item.image.count == 2 {
let group = DispatchGroup()
group.enter()
var downsizedImage = [UIImage]()
DispatchQueue.global().async {
downsizedImage.append(item.image[0].downsizeImage(.low)!)
downsizedImage.append(item.image[1].downsizeImage(.low)!)
group.leave()
}
group.notify(queue: .main) {
imageOne.image = downsizedImage[0]
imageTwo.image = downsizedImage[1]
imageThree.image = nil
self.setUpStackView([imageOne,imageTwo])
}
}
if item.image.count > 2 {
let group = DispatchGroup()
group.enter()
var downsizedImage = [UIImage]()
DispatchQueue.global().async {
downsizedImage.append(item.image[0].downsizeImage(.low)!)
downsizedImage.append(item.image[1].downsizeImage(.low)!)
downsizedImage.append(item.image[2].downsizeImage(.low)!)
group.leave()
}
group.notify(queue: .main) {
imageOne.image = downsizedImage[0]
imageTwo.image = downsizedImage[1]
imageThree.image = downsizedImage[2]
self.setUpStackView([imageOne,imageTwo,imageThree])
}
}
imageOne.contentMode = .scaleAspectFill
imageOne.clipsToBounds = true
imageTwo.contentMode = .scaleAspectFill
imageTwo.clipsToBounds = true
imageThree.contentMode = .scaleAspectFill
imageThree.clipsToBounds = true
}
func setUpStackView(_ views: [UIView]) {
self.imageContainer = UIStackView(arrangedSubviews: views)
self.imageContainer.axis = .horizontal
self.imageContainer.distribution = .fillEqually
placeholder.sv(imageContainer)
imageContainer.addConstrainsToSuperView(distance: 0, superView: placeholder)
}