UICollectionViewCell 和 UICollectionView 中的平移手势

Pan Gesture in UICollectionViewCell AND UICollectionView

我有一个可以上下滑动的条形集合视图。集合视图中的每个单元格都使用 UIPanGestureRecognizer 来控制上下滑动的蓝色条。集合视图不会在此处滚动。

有一个 "edit mode" 可以禁用控制栏的平移手势。这里的希望是在"edit mode"之后,collection view可以左右滚动。

我这样做的尝试是禁用每个单元格中的平移手势。我还尝试使用 UIGestureRecognizerDelegate 方法来尝试禁用触摸并使单元格的平移手势失败,以支持集合视图的平移手势。似乎集合视图的平移手势没有转发到单元格的任何手势委托调用。

这些委托调用让我最接近(单元格平移手势的委托):

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    return !self.editMode  // bar doesn't need to pan in edit mode
}

有了这个实现,如果我在单元格之间的白色 space 中开始平移,我就可以平移集合视图。但是,在单元格上启动平底锅不会做任何事情。

编辑:我将问题的 sample project 上传到 github。

你走在正确的轨道上。保留对您的 leftRight gestureRecognizer 的引用。然后在 shouldReceiveTouch 中,检查是否编辑 and gestureRecognizer 是你的 leftRight 识别器

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if(self.editing && gestureRecognizer != self.leftRightRecognizer){
        return 0;
    }
    return 1; 
}

尝试在 VOLBarSliderCell:29 添加此代码:

self.panGesture.enabled = !self.editing

并删除:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if self.editing && gestureRecognizer == self.panGesture {
        return false
    }

    return true
}

公平地说,我并不清楚你的问题,所以我还是试了一下作为答案,因为我还不能评论以请求澄清。

我了解到您想在编辑模式下滚动 UICollectionView。这就是上面的代码所做的。如果您希望在不编辑时完全禁用 UICollectionView 的滚动,那么您可以在 UICollectionView 上使用 scrollEnabled = false。

更好地说明您要解决的问题是什么。那样你或许可以得到准确的答案。

如果我理解正确的话,我认为问题可能如下:

  1. 您的 UICollectionView 将侦听平移手势。到目前为止一切顺利。
  2. 在 KBHBarSlider 中,您为滑块添加了 UIPanGestureRecognizer。他们在底层 UICollectionView 上有 "priority"。

这实际上是有道理的,因为您的 BarSlider 位于 CollectionView 之上。我最好的做法是让 BarSliders 在需要时添加 UIPanGestureRecognizer,并在编辑时将它们完全删除。

所以首先尝试删除您在 VOLBarSliderCell 中添加的 gestureRecognizer

然后在 KBHBarSlider 中添加如下内容:(并确保您的 init 调用 addPanRecognizer() 而不是 setup())

func addPanRecognizer() {
    let panGesture = UIPanGestureRecognizer(target: self, action: "viewDidPan:")
    self.gestureRecognizers = [panGesture]
}

func removePanRecognizer() {
  self.gestureRecognizers = []
}

现在可以根据需要添加和删除手势,从您的编辑中执行 get/set VOLBarSliderCell 中的覆盖:

var editing: Bool = false {
    didSet {            
        if !self.editing {
            self.barSlider.addPanRecognizer()
            // Removed code, to keep this example short...
        } else {
            self.barSlider.removePanRecognizer()
            // Removed code, to keep this example short...
        }
    }
}