0
votes

Si j'ai 4 cellules et chargez les images pour 4 cellules, mais toutes les 4 images sont superposées uniquement sur la dernière cellule

Je dois charger les images dans chaque cellule et retourner la cellule Uicollectionview. Mais toutes les images sont chevauchées dans la dernière cellule ..

Lorsque j'ai débogué, l'image est définie dans le gestionnaire d'achèvement et définit l'image une fois que les cellules sont réellement renvoyées. P>

Depuis que j'utilise auto dans le bloc rempli du SD_SetImage, qui indique la dernière cellule lorsque le bloc d'achèvement commence à exécuter, de sorte que toutes les images sont définies dans la même cellule, je suppose .. p>

soit je dois régler l'image avant La cellule est renvoyée, ou int son bloc d'achèvement alors qu'il se définit doit avoir la référence appropriée à la cellule. Comment faire cela .... p>

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

        cell = collectionView.dequeueReusableCell(withReuseIdentifier: CELL_IDENTIFIER, for: indexPath) as? CollectionViewCell

        var row = 0
        row = indexPath.row
        let imageView = UIImageView()
        var imgURL: String? = nil
        if let object = (dataSource[row] as? [AnyHashable : Any])?["src"] {
            imgURL = "\(object)"
        }
        let url = URL(string: imgURL ?? "")

        imageView.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholder.png"), completed: { [weak self] (image, error, cacheType, imageURL) in

            self?.cell?.cellImageView.image = imageView.image

        })

        imageView.contentMode = .scaleAspectFill
        var shoptitle: String? = nil
        if let object = (dataSource[row] as? [AnyHashable : Any])?["shop_name"] {
            shoptitle = "\(object)"
        }

        cell?.txtDescription.text = shoptitle
        cell?.shareIcon.tag = indexPath.item
        cell?.cellImageView.tag = indexPath.item
        cell?.cellImageView.isUserInteractionEnabled = true

        cell?.shareIcon.addTarget(self, action: #selector(click(_:)), for: .touchUpInside)
        cell?.layer.shadowOpacity = 0.5
        cell?.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
        cell?.layer.shadowRadius = 10.0
        cell?.layer.shadowColor = UIColor.gray.cgColor

        return cell!
    }


4 commentaires

Je ne comprends pas pourquoi vous avez utilisé auto pour la cellule. Si je ne me trompe pas, vous pouvez utiliser la cellule comme dans le bloc du gestionnaire sans avoir besoin de auto . De plus, si ce code fonctionne sans erreur, votre VC doit avoir une propriété nommée «cellule», que vous mettez à jour sur chaque rappel.


Soi?


Essayez de faire de l'objet cellulaire dans la méthode "CORELFORITEMAT".


@Loksn Si je ne m'utilise pas moi, je reçois une erreur de compilateur "La référence à la propriété" cellule "en fermeture nécessite" soi-même ". rendre la sémantique de capture explicite ". c'est la raison pour laquelle j'ai fixé la suggestion donnée par Xcode


3 Réponses :


0
votes

Avez-vous essayé de supprimer cette ligne de code?

auto? .Cell? .CellImageView.Image = imageview.Image


1 commentaires

Je ne l'ai pas essayé. Mais la solution de Hoquasse Ekramul a travaillé pour moi. Je vous remercie



0
votes

Si sa ne fonctionne pas que simplement définir une image sur COREL.CELIMAGEVIEW CODE> Comme ceci:

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

        cell = collectionView.dequeueReusableCell(withReuseIdentifier: CELL_IDENTIFIER, for: indexPath) as? CollectionViewCell

        var row = 0
        row = indexPath.row
        let imageView = UIImageView()
        var imgURL: String? = nil
        if let object = (dataSource[row] as? [AnyHashable : Any])?["src"] {
            imgURL = "\(object)"
        }
        let url = URL(string: imgURL ?? "")

        cell.cellImageView.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholder.png"), completed: { 
[weak self] (image, error, cacheType, imageURL) 
in

})

        imageView.contentMode = .scaleAspectFill
        var shoptitle: String? = nil
        if let object = (dataSource[row] as? [AnyHashable : Any])?["shop_name"] {
            shoptitle = "\(object)"
        }

        cell?.txtDescription.text = shoptitle
        cell?.shareIcon.tag = indexPath.item
        cell?.cellImageView.tag = indexPath.item
        cell?.cellImageView.isUserInteractionEnabled = true

        cell?.shareIcon.addTarget(self, action: #selector(click(_:)), for: .touchUpInside)
        cell?.layer.shadowOpacity = 0.5
        cell?.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
        cell?.layer.shadowRadius = 10.0
        cell?.layer.shadowColor = UIColor.gray.cgColor

        return cell!
    }


0 commentaires

0
votes

Veuillez essayer ci-dessous le code avec faire un objet de cellule dans la méthode "CocheForitemat" xxx


1 commentaires

Merci Rohit. Je viens d'essayer la solution de Ekramul Huit et ça a fonctionné pour moi. Merci pour votre temps.