выделение ячейки uicollectionview при нажатии - PullRequest
0 голосов
/ 30 августа 2018

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

Я пробовал несколько подходов, основанных на решениях ( 1 ) ( 2 ). Я видел здесь в стеке, но ничего, к моему удовольствию.

Решение 1 : реализовать методы делегата UICollectionViewController:

class SlideOutMenuViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout{
   //Setup code and other delegate methods….

    override func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells

        cell.backgroundColor = .white
    }

    override func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells

        cell.backgroundColor = UIColor.mainGreen()
    }
}

Когда я попробовал это решение, ничего не произошло. Цвет фона ячеек не меняет цвета.

Решение 2 : Это решение приводит к лучшим результатам, за исключением того, что ячейка меняет цвет, когда я держу ячейку. Мне бы хотелось, чтобы цвет фона ячеек мигал или быстро выделялся при нажатии , а не только в том случае, если пользователь удерживает ячейку нажатой.

class SlideOutMenuCells: UICollectionViewCell {

    //Setup code...

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                backgroundColor = UIColor.darkGreen()
            } else {
                backgroundColor = UIColor.mainGreen()
            }
        }
    }
}

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

Ответы [ 4 ]

0 голосов
/ 05 мая 2019

У меня была точно такая же проблема, и решение на самом деле намного проще, чем приведенное выше.

В вашем контроллере представления добавьте collectionView.delaysContentTouches = false.

А потом ваш другой код в ячейке был в порядке, как:

class SlideOutMenuCells: UICollectionViewCell {

    //Setup code...

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                backgroundColor = UIColor.darkGreen()
            } else {
                backgroundColor = UIColor.mainGreen()
            }
        }
    }
}

Но теперь эта досадная задержка прошла!

0 голосов
/ 14 сентября 2018

Вы можете попытаться использовать UILongPressGestureRecognizer для обозначения выбора:

override func awakeFromNib() {
    super.awakeFromNib()

    let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
    tapGesture.minimumPressDuration = 0
    tapGesture.cancelsTouchesInView = false
    addGestureRecognizer(tapGesture)
}

@objc func didTap(recognizer: UILongPressGestureRecognizer) {
    if recognizer.state == .began {
        backgroundColor = .red
    }
    if recognizer.state == .ended {
        backgroundColor = .green
    }
}

или вы можете сделать extension для UICollectionViewCell

extension UICollectionViewCell {
func makeSelectionIndicatable() {
    let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
    tapGesture.minimumPressDuration = 0
    tapGesture.cancelsTouchesInView = false
    addGestureRecognizer(tapGesture)
}

@objc private func didTap(recognizer: UILongPressGestureRecognizer) {
    if recognizer.state == .began {
        backgroundColor = .red
    }
    if recognizer.state == .ended {
        backgroundColor = .green
    }
}

}

и после этого для любой ячейки в методе awakeFromNib() вам просто нужно добавить makeSelectionIndicatable()

0 голосов
/ 17 сентября 2018

Вы можете сделать это, изменив цвет, если просмотр содержимого в ячейке, например:

class SlideOutMenuCells: UICollectionViewCell {

override var isSelected: Bool {
    didSet {
        self.contentView.backgroundColor = isSelected ? OLTheme.Colors.Selected_Voucher_Color : UIColor.clear
    }
} 
}
0 голосов
/ 13 сентября 2018

Вот рабочий код для выделения UICollectionViewCell при нажатии (swift 4)

Раствор 1

class StoreCollViewCell:UICollectionViewCell{

    override var isSelected: Bool {
        didSet {
            self.contentView.backgroundColor = isSelected ? UIColor.red : UIColor.clear
        }
    }
}

Решение 2

Ничего не нужно делать в вашем UICollectionViewCell классе.

class StoreListViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {

    var previousSelected : IndexPath?
    var currentSelected : Int?

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

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoreCollViewCell", for: indexPath) as! StoreCollViewCell

        // To set the selected cell background color here
        if currentSelected != nil && currentSelected == indexPath.row
        {
            cell.backgroundColor = UIColor.green
        }else{
            cell.backgroundColor = UIColor.yellow
        }

        return cell     
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        // For remove previously selection 
        if previousSelected != nil{
            if let cell = collectionView.cellForItem(at: previousSelected!){
                cell.backgroundColor = UIColor.yellow
            }
        }
        currentSelected = indexPath.row
        previousSelected = indexPath

        // For reload the selected cell
        self.collVwStores.reloadItems(at: [indexPath]) 
    }
}

выход

enter image description here

enter image description here

...