2017-10-19 25 views
0
class SceneCell: UICollectionViewCell { 

    override var isSelected: Bool { 
     didSet { 
      setSelected(bool: isSelected) 
     } 
    } 

    override var isHighlighted: Bool { 
     didSet { 
      setHighlighted(bool: isHighlighted) 
     } 
    } 

    @IBOutlet weak var thumbnailImageView: UIImageView! 

    override func draw(_ rect: CGRect) { 
     super.draw(rect) 

     self.backgroundColor = .clear 
     self.thumbnailImageView.layer.borderColor = UIColor.green.cgColor 
     self.thumbnailImageView.layer.masksToBounds = true 
     self.thumbnailImageView.clipsToBounds = true 
     self.thumbnailImageView.layer.cornerRadius = 8 
    } 

    func update(with scene: Scene) { 

    } 

    private func setHighlighted(bool: Bool) { 
     if bool { 
      self.alpha = 0.5 
     } else { 
      self.alpha = 1.0 
     } 
    } 

    private func setSelected(bool: Bool) { 
     if bool { 
      self.thumbnailImageView.layer.borderWidth = 2.5 
     } else { 
      self.thumbnailImageView.layer.borderWidth = 0 
     } 
    } 
} 

Dans mon code, je modifie la largeur de la bordure de couche de la vue de l'image à 2,5 lorsque isSelected est défini sur true. Lorsque je sélectionne une cellule et que l'on fait défiler la vue de collection, je pensais que la cellule restait dans l'état sélectionné lors de la réutilisation de la cellule sélectionnée, mais que la cellule de réutilisation passait à l'état non sélectionné. Deuxièmement, lorsque je suis retourné à la cellule sélectionnée et que j'ai réutilisé la cellule non sélectionnée, j'ai pensé qu'elle était dans un état non sélectionné. Mais la cellule est automatiquement définie.Est-il mauvais de changer de cellule de vue de collection avec un observateur de propriété?

Dose la vue de la collection les gère automatiquement?

Répondre

0

Le code de la question fonctionne parfaitement. Voici une solution alternative pour enregistrer les sélections de cellules et appliquer les paramètres pour l'état sélectionné/désélectionné.

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource { 
    //...... 

    var selectedIndexPaths = [IndexPath]() 

    public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     selectedIndexPaths.append(indexPath) 
    } 

    public func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { 
     if let index = selectedIndexPaths.index(of: indexPath) { 
      selectedIndexPaths.remove(at: index) 
     } 
    } 

    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     //... 
     cell.setSelected(selectedIndexPaths.contains(indexPath)) //Remember to make the cell's setSelected() public. 
     //... 
    } 

    //...... 
} 
+0

Mais mon code fonctionne parfaitement. – Sohn

+0

Fonctionne parfaitement avec le problème de réutilisation? Je suppose que ça fonctionne parfaitement quand il n'y a pas de défilement, n'est-ce pas? –

+0

Il n'a pas de problème de réutilisation. Ma question est pourquoi ce code fonctionne bien. – Sohn