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。
更好地说明您要解决的问题是什么。那样你或许可以得到准确的答案。
如果我理解正确的话,我认为问题可能如下:
- 您的 UICollectionView 将侦听平移手势。到目前为止一切顺利。
- 在 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...
}
}
}
我有一个可以上下滑动的条形集合视图。集合视图中的每个单元格都使用 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。
更好地说明您要解决的问题是什么。那样你或许可以得到准确的答案。
如果我理解正确的话,我认为问题可能如下:
- 您的 UICollectionView 将侦听平移手势。到目前为止一切顺利。
- 在 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...
}
}
}