在具有相同触摸的视图上切换手势

Posted

技术标签:

【中文标题】在具有相同触摸的视图上切换手势【英文标题】:Switch between gestures on a view with same touch 【发布时间】:2017-01-06 05:50:12 【问题描述】:

UICollectionView 中我添加了UIPanGestureRecognizer。起初UIPanGestureRecognizer 被禁用,我想在UICollectionViewcontentOffset.y 在滚动过程中达到某个值时启用它。我试图通过以下代码来实现这一点。但它仅适用于屏幕上的第二次触摸。当 contentOffset.y 为 44 时,我想在不松开手指的情况下使用手势。

 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool 
    if collectionView.contentOffset.y == CGFloat(44) 
        return false
    
    return true

【问题讨论】:

【参考方案1】:

是的。根据您的逻辑,它仅在第二次触摸时发生。尝试在 scrollView Delegate 方法中启用或禁用平移手势,如下所示。

func scrollViewDidScroll(scrollView: UIScrollView) 
     if collectionView.contentOffset.y < CGFloat(44) 
        panGesture.enabled = false
    
    panGesture.enabled = true

【讨论】:

感谢人的回答。但我需要取下手指并再次触摸以处理该逻辑。【参考方案2】:

在你的手势开始状态检查条件

 func gestureTap(sender : UIGestureRecognizer)        
   if sender.state == .began 
       if collectionView.contentOffset.y == CGFloat(44) 

        else 
         return
       
    

或者

在 scrollView Delegate 方法中你也可以检查。检查下面

func scrollViewDidScroll(scrollView: UIScrollView) 
     if collectionView.contentOffset.y < CGFloat(44) 
        yourGesture.enabled = false
     else 
    yourGesture.enabled = true
   

【讨论】:

感谢人的回答。要使用第一个回答手势,应启用,如果启用,则无法滚动。最主要的是在滚动过程中,我们应该放下手指并再次触摸以处理该逻辑。实际上,只有当 contentOffset.y 为 44 时,我才需要使用手势。 @sant05 更新答案

以上是关于在具有相同触摸的视图上切换手势的主要内容,如果未能解决你的问题,请参考以下文章

在下次触摸之前无法接收系统手势状态通知

带有手势识别器的 UITextView - 有条件地向前触摸到父视图

iOS 在处理触摸事件之前执行操作

传播特定的触摸事件以在下面查看

触摸手势

没有设置触摸手势,但 tabBar 只响应长按。为啥?