UICollectionViewCell和UICollectionView中的Pan Gesture

时间:2015-05-26 01:58:46

标签: ios swift uicollectionview uicollectionviewcell uipangesturerecognizer

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

Active

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

Edit Mode

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

实现这个后,如果我在单元格之间的空白处开始平移,我可以平移集合视图。但是,在一个小区上开始平底锅不会做任何事情。

编辑:我向github上传了sample project个问题。

3 个答案:

答案 0 :(得分:3)

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

  1. 您的UICollectionView将侦听平移手势。到目前为止一切顺利。
  2. 在KBHBarSlider中,为滑块添加UIPanGestureRecognizer。他们有优先权"在底层的UICollectionView。
  3. 这实际上是有意义的,因为您的BarSliders高于CollectionView。我最好的做法是让BarSliders在需要时添加UIPanGestureRecognizer,并在编辑时将它们完全删除。

    首先尝试删除您在VOLBarSliderCell中添加的var htmlD = htmlDoc.DocumentNode.SelectNodes("//td[a/@title='Proxy details']"); var numberProxies = htmlD.Count; foreach(HtmlNode node in htmlD) { var ip = node.InnerText; var port = node.SelectSingleNode("following-sibling::td[1]").InnerText; Console.WriteLine("IP: {0} > Port: {1}", ip, port); }

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

    gestureRecognizer

    现在可以根据需要添加和删除手势,可以通过VOLBarSliderCell中的编辑获取/设置覆盖来执行此操作:

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

答案 1 :(得分: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。

更清楚地说明您要解决的问题是什么。这样你就可以得到准确的答案。

答案 2 :(得分:0)

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

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