如何使用多点触控一次启用多个集合视图单元格?

Swe*_*per 7 multi-touch ios uicollectionview swift

我正在写一个iOS卡游戏.我在收藏视图中显示玩家的牌.玩家可以通过点击它们来选择一张或多张牌,然后按交易按钮来处理所选的牌.

我想允许用户使用多个手指一次选择多张卡片.例如,如果用户想要选择2张牌,他只需要用两根手指同时敲击这两张牌,并且他们都将被选中.似乎默认情况下,UICollectionView不允许这样做.当我用2个手指敲击时,即使isMultipleTouchEnabled属性UIView已设置为true ,也只会选择其中一个卡片.

请注意,我不是在询问如何允许用户在集合视图中选择多个项目.我可以而且确实已经这样做了allowsMultipleSelection = true.我要问的是如何让用户用2个手指(或n个手指n个手指)选择2个单元格.

我发现了这个问题,但这似乎是关于如何在选中时在单元格周围显示边框.

我也查看了文档,UICollectionView但我发现没有控制它的属性.

Jon*_*ose 7

首先让我们准确理解问题所在.collectionView附有一堆UIGestureRecognisers(用于平移,触摸,缩放等).每个识别器具有相同的状态机,可能 - >识别 - >已更改 - >已结束/已失败.每个识别器都有一个清晰的开始和结束.一旦轻敲手势在一个位置开始,它就不会在另一个位置开始.当人1)触摸点A 2)触摸点B 3)触摸点A 4)触摸点B,该手势完全忽略点B,因为它"聚焦"在点A上.

第二个问题是,如果你在同一时间触摸两个点,那么这个方法tapGesture.location(in: view)会给你这两个位置的平均值.

但是我们解决这个问题的第一步是禁用collectionView tapGesture - 它没有做我们想要的事情:

  self.collectionView.allowsMultipleSelection = true
  self.collectionView.allowsSelection = false;
Run Code Online (Sandbox Code Playgroud)

接下来,我们将分别为每个单元格添加自己的点击手势.这明确不是苹果推荐的("你应该总是将你的手势识别器附加到集合视图本身 - 而不是特定的单元格或视图." 1)但它会起作用:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
 ...
  cell.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(didTap(tapper:))))
  ...
  return cell;
}

@objc func didTap(tapper:UIGestureRecognizer) {
  if let cell = tapper.view as? UICollectionViewCell{
    if let index = collectionView.indexPath(for: cell) {
      if collectionView.indexPathsForSelectedItems?.contains(index) ?? false {
        collectionView.deselectItem(at: index, animated: true)
        cell.isSelected = false
      }else{
        collectionView.selectItem(at: index, animated: true, scrollPosition: [])
        cell.isSelected = true
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)