2017-10-19 10 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 
     } 
    } 
} 

私のコードでは、isSelectedがtrueに設定されていると、画像ビューのレイヤーの境界線幅を2.5に変更しました。プロパティオブザーバを持つコレクションビューのセルを変更するのは悪いですか?

1つのセルを選択してコレクションビューをスクロールすると、選択したセルを再利用するとセルは選択状態のままだが、再利用セルは選択されていない状態に変わります。第二に、選択したセルに戻り、選択されていないセルを再利用すると、選択されていない状態にあると思った。しかし、セルは自動的に選択されます。

収集ビューでは、これらを自動的に管理しますか?

答えて

0

質問のコードは完全に機能しています。ここでは、セルの選択を記録し、選択/選択解除された状態の設定を適用するための代替ソリューションがあります。

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

しかし、私のコードは完全に機能します。 – Sohn

+0

再利用の問題で完全に動作しますか?スクロールしないと完璧に動作していると思いますか? –

+0

再利用の問題はありません。私の質問は、このコードがうまく機能する理由です。 – Sohn