如何使UICollectionView仅在"touch up"时选择单元格,而不是"touch down"?

4

我所拥有的基本上是一个非常简单的UICollectionViewCell子类。通过观察其isSelected属性,该子类会更改其背景颜色和其他美学特征:

class SelectableCell: UICollectionViewCell {

    override var isSelected: Bool{
        didSet{
            if(isSelected)
            {
                self.backgroundColor = UIColor.white
            }
            else
            {
                self.backgroundColor = UIColor.black
            }
        }
    }
}

如果我在我的集合视图中点击其中一个单元格,背景会相应地改变,这基本上可以正常工作。

问题是,如果我选择一个单元格,然后决定滚动我的收藏,该单元格将取消选择,直到我完成滚动,然后重新选择。

(注意:当我说重新选择时,并不意味着像didSelectItem这样的委托函数被触发 - 只是isSelected属性返回true)

只有当我在另一个单元格的边界内开始滚动时,才会出现这种情况。

因此,我认为它立即在我触摸时取消了单元格的选择状态,当它检测到我滚动而不是点击时,它会回滚选择状态并重新选择正确的单元格。

是否有一种方法可以使其仅在松开触摸时提交,或者在中间期间保持选定状态?

2个回答

3

当只能选择一个单元格时,集合视图处理选择的方式是这样的。其中一个可能的解决方法是使用多选。在这种情况下,您需要自己管理先前选择的单元格的取消选择。像这样:

// somewhere in viewDidLoad
collectionView.allowsMultipleSelection = true

//then in your delegate method
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    guard let selectedIndexPaths = collectionView.indexPathsForSelectedItems else { return }

    for selectedIndexPath in selectedIndexPaths where selectedIndexPath != indexPath {
        collectionView.deselectItem(at: selectedIndexPath, animated: true)
    }
}

0
如何使 UICollectionView 仅在 touchup 时选择单元格而非 touch down

这里有一个快速的解决方案或想法。我还没有尝试过,但我相当确定这会起作用:
  1. 将一个清除按钮添加到您的单元格中,占据单元格的边缘。
  2. 添加一个选择器,具有所需事件,因此在这种情况下,如果有任何 touch down
  3. 然后向您的单元格添加完成块或协议以将事件发送到您的控制器。
希望这有所帮助!

嗯,这确实解决了眼前的问题,但又造成了另一个小不便!由于单元格中有按钮,集合视图的滚动不够一致。如果我快速滑动它会滚动,但如果我把手指放在单元格上停留时间稍微有点长,就无法滚动。我想发生的情况是按钮吃掉了输入,所以它不是从轻触过渡到滑动,而是直接忽略了滑动。好消息是在实际设备上比模拟器上不太明显。但我仍然认为可能有更好的方法没有任何缺点。 - Bebhead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接