UICollectionView перезагружает данные, вызывая графические сбои - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь сделать свой выбор цвета.Цвет слева - это выбранный цвет, другие цвета - другие варианты.Однако, когда я перезагружаю Data (), одна из ячеек на краю collectionView будет иметь предыдущую ячейку ниже этой новой ячейки.

Я попытался создать пользовательский collectionViewCell и затем добавить представления в UICollectionViewCell по умолчанию.Я пытался диагностировать проблему, применяя теневой эффект к представлениям, так как я знаю, что ячейки накладываются друг на друга.Ранее я кодировал collectionView, создавая ячейки-прототипы в раскадровке, однако для функции, которую я хочу, и я не могу этого сделать.

Это код для cellForItemAtIndexPath и при перезагрузке представления коллекции.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = self.dequeueReusableCell(withReuseIdentifier: "colorCell", for: indexPath)
        var color = UIColor.white
        if colors.count == 0{
            color = UIColor(red: CGFloat(mainManager.colors[indexPath.row][0] ), green: CGFloat(mainManager.colors[indexPath.row][1] ), blue: CGFloat(mainManager.colors[indexPath.row][2] ), alpha: 1.0)
        }
        else{
            color = UIColor(red: CGFloat((colors[indexPath.row][0] ) ), green: CGFloat((colors[indexPath.row][1] ) ), blue: CGFloat((colors[indexPath.row][2] ) ), alpha: 1.0)
        }
        if indexPath.row == 0{
            let cellView = UIView()
            cell.addSubview(cellView)
            cellView.translatesAutoresizingMaskIntoConstraints = false
            cellView.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
            cellView.centerXAnchor.constraint(equalTo: cell.centerXAnchor).isActive = true
            cellView.widthAnchor.constraint(equalTo: cell.widthAnchor, multiplier: 0.8).isActive = true
            cellView.heightAnchor.constraint(equalTo: cell.heightAnchor, multiplier: 0.8).isActive = true
            cellView.roundEdgesAndShadow()
            cellView.backgroundColor = color
        }
        else{
            let centerView = UIView()
            cell.addSubview(centerView)
            centerView.translatesAutoresizingMaskIntoConstraints = false
            centerView.centerXAnchor.constraint(equalTo: cell.centerXAnchor).isActive = true
            centerView.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
            centerView.widthAnchor.constraint(equalTo: cell.widthAnchor, multiplier: 0.4).isActive = true
            centerView.heightAnchor.constraint(equalTo: cell.heightAnchor, multiplier: 0.4).isActive = true
            centerView.roundEdgesAndShadow()
            centerView.backgroundColor = color
        }
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if colors.count == 0{
            colors = mainManager.colors.sorted(by: { (a, b) -> Bool in
                if a == mainManager.colors[indexPath.row]{
                    return true
                }
                else{
                    return false
                }
            })
        }
        else{
            colors = mainManager.colors.sorted(by: { (a, b) -> Bool in
                if a == self.colors[indexPath.row] {
                    return true
                }
                else{
                    return false
                }
            })
        }
        self.reloadData()
    }

1 Ответ

0 голосов
/ 06 апреля 2019

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

...