我有UICollectionView 2行10+单元格。 默认取消选择。当我点击它时会被选中,但是当我再次点击它而不是取消选择时。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(indexPath)
let cell = collectionView.cellForItem(at: indexPath)
let collectionActive: UIImageView = {
let image=UIImageView(image: #imageLiteral(resourceName: "collectionActive"))
image.contentMode = .scaleAspectFill
return image
}()
let collectionInactive: UIImageView = {
let image=UIImageView(image: #imageLiteral(resourceName: "collectionInactive"))
image.contentMode = .scaleAspectFill
return image
}()
if cell?.isSelected == true {
cell?.backgroundView = collectionActive
}else{
cell?.backgroundView = collectionInactive
}
}
如何解决这个问题?
答案 0 :(得分:2)
在viewDidLoad()
中collectionView.allowsMultipleSelection = true;
后记我实现了这些方法
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let cell = collectionView.cellForItemAtIndexPath(indexPath) as! MyCell
cell.toggleSelected()
}
func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
let cell = collectionView.cellForItemAtIndexPath(indexPath) as! MyCell
cell.toggleSelected()
}
终于在我班上了
class MyCell : UICollectionViewCell {
func toggleSelected ()
{
if (selected){
backgroundColor = UIColor.redColor()
}else {
backgroundColor = UIColor.whiteColor()
}
}
}
答案 1 :(得分:1)
对于Swift 5 +
在viewDidLoad()
Role assignments
后记我实现了这些方法
collectionView.allowsMultipleSelection = true
在TableView单元格类中
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! MovieDetailsDateCollectionViewCell
cell.toggleSelected()
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! MovieDetailsDateCollectionViewCell
cell.toggleSelected()
}
答案 2 :(得分:0)
根据UICollectionView class doc,,你可以使用:
var selectedBackgroundView: UIView? { get set }
您可以使用此视图在单元格选中时为其提供自定义外观。选择单元格后,此视图位于backgroundView上方和contentView后面。
在cellForItem(at indexPath: IndexPath) -> UICollectionViewCell?
功能的示例中,您可以设置:
cell.backgroundView = collectionInactive
cell.selectedBackgroundView = collectionActive
答案 3 :(得分:0)
如果您不想启用多项选择并且一次只想要选择一个单元格,则可以改为使用以下代理:
如果选择了单元格,则会取消选择所有单元格,否则如果未选择单元格,则会正常选择单元格。
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
let cell = collectionView.cellForItem(at: indexPath) as! CustomCell
if cell.isSelected {
collectionView.selectItem(at: nil, animated: true, scrollPosition: [])
return false
}
return true
}
答案 4 :(得分:0)
如果选择了单元格,只需在cell.isSelected = false
委托和shouldSelectItemAt
块中设置DispatchQueue.main.async { }
。因此,在执行false
之后,状态实际上(非常)更改为shouldSelectItemAt
。
它看起来可能像黑客一样,但实际上可以工作。
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
if let cell = collectionView.cellForItem(at: indexPath), cell.isSelected {
DispatchQueue.main.async { // change the isSelected state on next tick of the ui thread clock
cell.isSelected = false
self.collectionView(collectionView, didDeselectItemAt: indexPath)
}
return false
}
return true
}
如果您发现/知道这样做的任何弊端,请告诉我。谢谢?
答案 5 :(得分:0)
在 iOS 14 及更新版本中,您可以设置单元格的 backgroundConfiguration
属性。设置后,所有用于选择和取消选择的必要视觉效果都会自动生效。您可以使用其中一种预配置的配置,如下所示:
cell.backgroundConfiguration = .listSidebarCell()
...或者从头开始创建一个 UIBackgroundConfiguration
对象。您还可以在应用前更改预配置。
更多信息在这里:https://developer.apple.com/documentation/uikit/uibackgroundconfiguration