Как выделить выделенные ячейки UICollectionView? (Swift)

У меня есть UICollectionView, и пользователь может выбрать несколько ячеек. Немного сложно отследить, какие ячейки были выделены, поэтому мне нужно каким-то образом выделить/создать границу при нажатии на ячейку.

Код:

func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {

    addToList.append(objectsArray[indexPath.row])

    return true

}

Ответы

Ответ 1

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

Swift 3.x:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    addToList.append(objectsArray[indexPath.row])
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.layer.borderWidth = 2.0
    cell?.layer.borderColor = UIColor.gray.cgColor
}

Ответ 2

Вот мое решение, и я уверен, что оно работает.

Мое решение включает в себя 3 эффекта подсветки: UICollectionCell selectedBackgroundView, cell.contentView.backgroundColor или ваш собственный specialHighlightedArea.

Как пользоваться? Просто наследуй BaseCollectionViewCell. При необходимости настройте методы делегирования в ячейке init или collectionView.

Если вам не нужен эффект выделения, просто найдите метод с именемshouldHighlightItemAtIndexPath в UICollectionViewDelegate и верните false или просто установите cell.shouldTintBackgroundWhenSelected = false.

extension UIColor {
    convenience init(rgb: Int, alpha: CGFloat = 1.0) {
        self.init(red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgb & 0xFF00) >> 8) / 255.0, blue: CGFloat(rgb & 0xFF) / 255.0, alpha: alpha)
    }
}
/// same with UITableViewCell selected backgroundColor
private let highlightedColor = UIColor(rgb: 0xD8D8D8) 

class BaseCollectionViewCell: UICollectionViewCell {

    var shouldTintBackgroundWhenSelected = true // You can change default value
    var specialHighlightedArea: UIView?

    // make lightgray background show immediately(使灰背景立即出现)
    override var isHighlighted: Bool { 
        willSet {
            onSelected(newValue)
        }
    }
    // keep lightGray background until unselected (保留灰背景)
    override var isSelected: Bool { 
        willSet {
            onSelected(newValue)
        }
    }
    func onSelected(_ newValue: Bool) {
        guard selectedBackgroundView == nil else { return }
        if shouldTintBackgroundWhenSelected {
            contentView.backgroundColor = newValue ? cellHighlightedColor : UIColor.clear
        }
        if let sa = specialHighlightedArea {
            sa.backgroundColor = newValue ? UIColor.black.withAlphaComponent(0.4) : UIColor.clear
        }
    }
}

Ответ 3

Используйте

collectionView.reloadItemsAtIndexPaths([indexPath])

чтобы перезагрузить текущую ячейку, или

collectionView.reloadData()

чтобы перезагрузить все ячейки в shouldSelectItemAtIndexPath

Затем в cellForItemAtIndexPath установите свой цвет границы или фона, если ячейка отмечена как отмеченная (вам может понадобиться новый массив для проверочных ячеек с предпочтительными индексами.

Ответ 4

Вы можете создать настраиваемый collcetionViewCell и переопределить:

class MyCell: UICollectionViewCell {

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                print("yes")
                // Your customized animation or add a overlay view
            } else {
                print("no")
                // Your customized animation or remove overlay view
            }
        }
    }
}

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

Без подклассов:

Если вы не хотите создавать свою собственную коллекциюViewCell. Вы можете использовать метод делегата:

func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath)

func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath)

Вы можете сделать то же самое с ним.

Ответ 5

Для множественного выбора ячейки вы можете сделать это следующим образом:

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

    if let currentCell = collectionView.cellForItem(at: indexPath) as? QuestionnaireCollectionViewCell {

        // Your selection logic, you can change it according to your requirement
       if currentCell.selectedImage.isHidden == true{
           currentCell.selectedImage.isHidden = false

       }
       else{
          currentCell.selectedImage.isHidden = true
       }
    }

    }

}

Для одиночного выбора вы можете использовать isSelected в классе collectionviewcell следующим образом:

 override var isSelected: Bool{
   didSet{
     if self.isSelected
     {
     //This block will be executed whenever the cells   selection state is set to true (i.e For the selected cell)
     }
    else
     {
     //This block will be executed whenever the cells selection state is set to false (i.e For the rest of the cells)
     }
   }
}

Ответ 6

СВИФТ

Добавьте этот код в свой подкласс UICollectionViewCell:

 override var isSelected: Bool {
    didSet{
        if self.isSelected {
            self.backgroundColor = UIColor(red: 115, green: 190, blue: 170, alpha: 1.0)
        }
        else {
            self.backgroundColor = UIColor(red: 60, green: 63, blue: 73, alpha: 1.0)
        }
    }
}

Это установит цвет отдельной выбранной ячейки и удалит выбранный цвет из любых предыдущих выбранных ячеек.

Ответ 7

Попробуйте сделать границы достаточно толстыми, чтобы покрыть всю ячейку

Код:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    addToList.append(objectsArray[indexPath.row])
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.layer.borderWidth = 200.0
    cell?.layer.borderColor = UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.4).cgColor
}