用属性观察者更改集合视图单元格是不是很糟糕?

时间:2017-10-19 05:51:46

标签: ios swift uicollectionview uikit uicollectionviewcell

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 :(得分: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.
        //...
    }

    //......
}