UICollectionView选择并取消选择

时间:2018-03-15 15:15:24

标签: ios swift uicollectionview

我有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
    }

}

如何解决这个问题?

6 个答案:

答案 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