Как НЕ использовать ячейки в UICollectionView - Swift - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть UICollectionView в ячейке UITableView.Этот UICollectionView отображает фотографии профиля пользователя.Там всего несколько предметов (предположим, что максимум 10 фотографий).

Итак, я не хочу перезагружать изображения из бэкэнда при каждом повторном использовании ячейки.Это неудобный и недружественный UX.Поэтому я хочу создать 10 ячеек, загрузить в них изображения и показать.

Но я не знаю, как создать (вместо удаления из очереди) новые пользовательские ячейки в методе "cellForItem" UICollectionView.Или как запретить повторное использование.

Я новичок в программировании, поэтому я был бы рад, если бы вы объяснили мне это простыми словами и наиболее подробно.Спасибо.

Вот мой код:

Настройка CollectinView (загрузка случайных локальных фотографий в целях тестирования):

extension PhotosTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if indexPath.row == 0 {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AddPhotoCollectionViewCell", for: indexPath)
            return cell
        } else {
            var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell", for: indexPath) as! PhotoCollectionViewCell
            cell.photo = UIImage(named: "Photo\(Int.random(in: 1...8))") ?? UIImage(named: "defaultPhoto")
            cell.layer.cornerRadius = 10

            return cell
        }
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let height = collectionView.frame.height
        let width = (height / 16.0) * 10.0

        return CGSize(width: width, height: height)
    }

}

Мой пользовательский PhotoCollectionViewCell:

class PhotoCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var heightConstraint: NSLayoutConstraint!
    @IBOutlet weak var widthConstraint: NSLayoutConstraint!

    var photo: UIImage! {
        didSet {
            // simulate networking delay
            perform(#selector(setImageView), with: nil, afterDelay: Double.random(in: 0.2...1))

            // setImageView()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    @objc private func setImageView() {
        let cellHeight = self.frame.height
        let cellWidth = self.frame.width
        let cellRatio = cellHeight / cellWidth

        let photoRatio = photo.size.height / photo.size.width

        var estimatedWidth = cellWidth
        var estimatedHeight = cellHeight

        if photoRatio > cellRatio {
            estimatedWidth = cellWidth
            estimatedHeight = cellWidth * photoRatio
        } else {
            estimatedHeight = cellHeight
            estimatedWidth = cellHeight / photoRatio
        }

        widthConstraint.constant = estimatedWidth
        heightConstraint.constant = estimatedHeight
        imageView.image = photo
    }

    override func prepareForReuse() {
        imageView.image = nil
    }

}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вам нужно каждый раз создавать новую ячейку и присваивать ей значение.Хотя это очень опасная вещь и может привести к тому, что ваше приложение будет занимать слишком много памяти при использовании, ваше приложение будет потреблять больше энергии и замедлять работу устройства.

Вместо этого я предлагаю вам сохранить ваши данные в Коллекции ипродолжать использовать его на ходу.

0 голосов
/ 14 декабря 2018

Просто создайте, заполните и верните новый объект ячейки в cellForItemAt вместо удаления его из очереди, но это не хорошая практика, и вы не должны этого делать.

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