Как выделить выделенные ячейки 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
}