【问题标题】:Pan Gesture in UICollectionViewCell AND UICollectionViewUICollectionViewCell 和 UICollectionView 中的平移手势
【发布时间】:2015-08-07 12:29:40
【问题描述】:

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

有一个“编辑模式”可以禁用控制条的平移手势。这里的希望是在“编辑模式”下,集合视图可以左右滚动。

我这样做的尝试是禁用每个单元格中的平移手势。我还尝试使用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
}

通过实现这一点,如果我在单元格之间的空白处开始平移,我可以平移集合视图。但是,在单元格上启动 pan 不会做任何事情。

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

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell uipangesturerecognizer


    【解决方案1】:

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

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

    【讨论】:

    • 这给了我与我自己实现手势委托时大致相同的功能。它的工作原理是十分之三。而且我无法真正解释它是如何发生的或为什么会发生。
    • 您是否能够在没有任何单元格识别器的情况下使用“编辑模式”?
    • 我现在正在玩这个。我上传了一个示例项目here,以防你想亲自看看。
    【解决方案2】:

    尝试在 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。

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

    【讨论】:

      【解决方案3】:

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

      1. 您的 UICollectionView 将监听平移手势。到目前为止一切顺利。
      2. 在 KBHBarSlider 中,您可以为滑块添加 UIPanGestureRecognizer。它们比底层 UICollectionView 具有“优先级”。

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

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

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

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

      现在可以按需添加和删除手势,通过 VOLBarSliderCell 中的编辑 get/set 覆盖来执行此操作:

      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...
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-07-09
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 1970-01-01
        • 2017-11-20
        相关资源
        最近更新 更多