измените фон uicollectionviewcell, когда он выбран, а также сделайте фон другой ячейки прозрачным - PullRequest
0 голосов
/ 03 октября 2018

Мне нужна помощь в этой проблеме.я хочу, чтобы мое приложение превратило фон для одной из его ячеек в UIColor.blue, но я также хочу, чтобы оно превратило весь фон другой ячейки в прозрачный цвет.в основном я хочу, чтобы выделенная ячейка выделялась среди остальных, указывая пользователю, что они просто щелкают по этой ячейке.

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

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let currentCell:dateCollectionCell = collectionViews.cellForItem(at: indexPath) as! dateCollectionCell
        currentCell.label.backgroundColor = .blue
    }

// вот весь код

class hello: UIView,UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 15
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let currentCell:dateCollectionCell = collectionViews.cellForItem(at: indexPath) as! dateCollectionCell
        currentCell.label.backgroundColor = .blue
    }

    lazy var collectionViews: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.minimumLineSpacing = 0
        layout.minimumInteritemSpacing = 0
        layout.sectionInset = UIEdgeInsetsMake(5,5,5,5)
        layout.scrollDirection = UICollectionViewScrollDirection.vertical
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.showsVerticalScrollIndicator = false
        cv.backgroundColor = UIColor.clear
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
    }

    func setupViews(){
        backgroundColor = .red
        collectionViews.register(warningCollectionCell.self, forCellWithReuseIdentifier: "cell")
        collectionViews.translatesAutoresizingMaskIntoConstraints = false
        addSubview(collectionViews)
        collectionViews.topAnchor.constraint(equalTo: topAnchor, constant: 0).isActive = true
        collectionViews.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0).isActive = true
        collectionViews.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 0).isActive = true
        collectionViews.centerXAnchor.constraint(equalTo: centerXAnchor, constant: 0).isActive = true
        collectionViews.widthAnchor.constraint(equalTo: widthAnchor, constant: 0).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете просто изменить цвет фона в функции cellForItemAt.Но сначала вам нужно отследить индекс строки, который вы хотите сделать синим:

var selectedCellIndex: Int = -1

Затем в функции cellForItemAt

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    if selectedCellIndex == indexPath.row {
        //turn blue
    }
    else {
        //make clear
    }

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let currentCell:dateCollectionCell = collectionViews.cellForItem(at: indexPath) as! dateCollectionCell
     selectedCellIndex = indexPath.row
     // reload the data to force the call to cellForItemAt 
     collectionView.reloadData()
}
...