Клетки UICollection смешиваются в быстром - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь сгенерировать ячейки и поместить в них метки. Тем не менее, когда я прокручиваю ярлыки между ячейками. Вот мой код, и я пытаюсь его решить.

    let lblTitle = UILabel()
    let lblMetro = UILabel()
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuCell", for: indexPath) as? UICustomCollectionViewCell

        if indexPath.row == 0 {
            lblTitle.frame = CGRect(x: 0, y: 0, width: 195, height: 40)
            lblTitle.font = UIFont.systemFont(ofSize: 14)
            lblTitle.textColor = UIColor.white
            lblTitle.backgroundColor =  colorLiteral(red: 0.2122299671, green: 0.4379466176, blue: 0.8993332386, alpha: 1)
            lblTitle.text = "  1”
            cell?.contentView.addSubview(lblTitle)
            }

                if indexPath.row == 1 {
           lblMetro.frame = CGRect(x: 55, y: 290, width: 100, height: 20)
            lblMetro.font = UIFont.boldSystemFont(ofSize: 17)
            lblMetro.textColor =  colorLiteral(red: 0, green: 0.3117707968, blue: 0.5609284043, alpha: 1)
            lblMetro.text = “2”
            cell?.contentView.addSubview(lblMetro)
            }

    return cell ?? UICollectionViewCell()
    }
 }

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Не оптимизировано, но это может решить проблему, удалите подпредставление из суперпредставления перед его добавлением:

cell?.contentView.lblTitle.removeFromSuperview()
cell?.contentView.addSubview(lblTitle)

И:

cell?.contentView.lblMetro.removeFromSuperview()
cell?.contentView.addSubview(lblMetro)
1 голос
/ 01 октября 2019

Я предлагаю использовать очень редко используемый метод UICollectionViewCell или UITableViewCell prepareForReuse. В определении UICustomCollectionViewCell вставьте функцию:

class UICustomCollectionViewCell: UICollectionViewCell {
    func prepareForReuse() {
        // This method is immediately called when a cell is about to be dequeued.
        super.prepareForReuse()
        if let view = contentView.viewWithTag(100) {
            view.removeFromSuperView()
        }

        if let view = contentView.viewWithTag(101) {
            view.removeFromSuperView()
        }
    }
}

Затем присвойте метки меткам

lblMetro.tag = 100
lblTitle.tag = 101

Это решение эффективно, если вы используете только ограниченные метки и ячейки. Для более общего подхода динамически создавайте ярлыки и делитесь тегами. В prepareForReuse () просто удалите подпредставление с этим тегом.

1 голос
/ 01 октября 2019

Здесь ячейки сняты с очереди

var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuCell", for: indexPath) as? UICustomCollectionViewCell

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

cell.contentView.subviews.forEach { 
   if $0.tag == 200 {
      $0.removeFromSuperview()
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...