ios - 如何使用多点触控一次选择多个 Collection View 单元格?

标签 ios swift uicollectionview multi-touch

我正在编写一个 iOS 纸牌游戏。我在 Collection View 中显示玩家的卡片。玩家可以通过点击来选择一张或多张牌,然后按下发牌按钮来发牌。

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

请注意,我不是在询问如何允许用户在 Collection View 中选择多个项目。我可以并且已经使用 allowsMultipleSelection = true 做到了这一点。我要问的是如何让用户用 2 个手指选择 2 个单元格(或用 n 个手指选择 n 个单元格)。

我找到了这个 question ,但这似乎是关于如何在单元格被选中时显示其周围的边框。

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

最佳答案

首先让我们准确了解问题所在。 collectionView 附有一堆 UIGestureRecognisers(用于平移、触摸、缩放等)。每个识别器都有相同的状态机 possible->recognised->changed->ended/failed。每个识别器都有一个明确的开始和结束。一旦点击手势在一个位置开始,它就不会在另一个位置开始。当一个人 1) touch down point A 2) touch down point B 3) touch up point A 4) touch up point B 手势完全忽略了 B 点,因为它“聚焦”在 A 点上。

第二个问题是,如果您同时触摸两个点,tapGesture.location(in: view) 方法将为您提供这两个位置的平均值。

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

  self.collectionView.allowsMultipleSelection = true
  self.collectionView.allowsSelection = false;

接下来,我们将分别向每个单元格添加我们自己的点击手势。这不是苹果明确推荐的(“你应该始终将你的手势识别器附加到 Collection View 本身——而不是特定的单元格或 View 。”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
      }
    }
  }
}

关于ios - 如何使用多点触控一次选择多个 Collection View 单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54379314/

相关文章:

ios - showViewController 不工作

arrays - 在 swift 3 中使用 Json

ios - UICollectionView 类引用委托(delegate)属性

ios - 侧边栏菜单不显示?

ios - 声明命名空间以影响 xamarin.forms 中的脚本 (Iphone X)

ios - Swift 如何从两个文本字段中获取 Int 并生成随机数

Swift 核心数据怪癖

Swift:在不使用索引的情况下从数组中删除有限数量的对象

ios - 如何使用 UICollectionView 在单元格左侧创建部分和标题?

ios - fatal error : unexpectedly found nil while unwrapping an Optional values