集合视图单元格的多项选择

Multiple selections on collection view cells

我正在尝试制作一个功能与 iOS 附带的照片应用程序类似的应用程序,我的功能允许您点击一个单元格来扩展图像以适合屏幕,然后点击图像将其关闭。我现在想添加 select 按钮,这样您就可以 select 多个可以下载的图像。我对此还很陌生,环顾四周,但找不到同时完成这两件事的示例。任何帮助都会很棒。

更新:

我当前的代码:

func numberOfSections(in collectionView: UICollectionView) -> Int {

    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    return imagesURLArray.count
}

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

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

    cell.backgroundColor = .clear
    cell.imageView.image = UIImage(contentsOfFile: imagesURLArray[indexPath.row].path)
    cell.checkmarkView.isHidden = true

    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath) -> CGSize {

    let paddingSpace = sectionInsets.left * (itemsPerRow + 1)
    let availableWidth = view.frame.width - paddingSpace
    let widthPerItem = availableWidth / itemsPerRow

    return CGSize(width: widthPerItem, height: widthPerItem)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,insetForSectionAt section: Int) -> UIEdgeInsets {

    return sectionInsets
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {

    return sectionInsets.left
}

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

    addZoomedImage(indexPath.row)
    addGestureToImage()
    addBackGroundView()

    view.addSubview(selectedImage)
}

我不知道从这里该何去何从,是否更容易将长按手势添加到 select 多张图片以下载或在照片应用程序中添加 select 按钮,这两个我都是不知道从哪里开始。

好的 - 一种方法:

  • 设计一个提供 "CheckMark" 功能(点击 check/uncheck)的自定义按钮(或找到一个已经制作好的按钮)
  • 将该按钮添加到您的 PhotoCell - 可能是左上角或右上角
  • 当在 CheckMark 按钮 上点击单元格时,切换它 checked/unchecked 并将消息发送回您的控制器以跟踪其状态
  • 如果点击单元格但未点击复选标记按钮,请像现在使用didSelectItemAt indexPath:
  • 一样处理它

这是一般的想法。下一个不错的地方可能是查看通过搜索 uicollectionviewcell check mark

找到的一些示例

//适用于 swift 3.3 希望对您有所帮助

 //my model struct

 struct Brands {
 var brandId: Int = 0
 var productId: Int = 0
 var name: String = ""
 var isChecked:Bool = false
 }

 var arrBrands = []//initialise arr of model

 func collectionView(_ collectionView: UICollectionView, 
 numberOfItemsInSection section: Int) -> Int {
 return arrBrands.count
 }

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

 let identifier: String = "brandCell"
 let cell: YourCustomCell? = 
 collectionView.dequeueReusableCell(withReuseIdentifier: identifier, 
 for: indexPath) as? YourCustomCell;

 let isChecked = arrBrands[indexPath.row].isChecked
 cell?.brandName.font = (isChecked) ?fontForTimesRoman(withStyle:"bold", andFontsize: 14):fontForTimesRoman(withStyle: "regular", 
   andFontsize: 14)
   cell?.brandName.text =  arrBrands[indexPath.row].name
  cell?.brandCheckButt.setImage((isChecked) ?UIImage(named:"filled_checkmark.png"):UIImage(named:"empty_checkmark.png"), for: .normal)

 return cell!
 }

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
 }

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  checkUncheckBrand(index: indexPath.row)
  }

  func collectionView(_ collectionView: UICollectionView, 
      didDeselectItemAt indexPath: IndexPath) {
       checkUncheckBrand(index: indexPath.row)
    }

   func  checkUncheckBrand(index:Int){
   arrBrands[index].isChecked = ! (arrBrands.isChecked)
   brandFilterCV.reloadData()
   }