如何不重用UICollectionView中的单元格-Swift

时间:2018-12-14 16:41:28

标签: ios swift uicollectionview uicollectionviewcell reuseidentifier

我在UITableView的单元格中有UICollectionView。此UICollectionView显示用户的个人资料照片。那里只有几个项目(假设最多10张照片)。

因此,我不想每次单元重用时都从后端重新加载图像。这是不方便且不友好的用户体验。因此,我想创建10个单元,将图像加载到其中并显示。

但是我不知道如何在UICollectionView的“ cellForItem”方法内创建(而不是让其出队)新的自定义单元格。或如何禁止重复使用。

我是编程方面的新手,因此,如果您以简单的文字和最详尽的解释向我解释,我将非常高兴。谢谢。

这是我的代码:

设置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 :(得分:1)

只需在 cellForItemAt 中创建,填充并返回新的单元格对象,而不是使其出队,但这不是一种常规做法,您不应该这样做。

答案 1 :(得分:0)

您每次需要创建一个新的单元格并为其分配值。尽管这样做是非常危险的事情,并且可能导致您的应用占用过多的内存,但使用该应用会消耗更多电量,并使设备运行速度变慢。

相反,我建议您将数据保存到集合中,并在使用时继续重复使用。