手势方法(平移手势和滑动手势)之间是不是有任何优先条件?

Posted

技术标签:

【中文标题】手势方法(平移手势和滑动手势)之间是不是有任何优先条件?【英文标题】:Is there any priority condition between gesture methods (Pan Gesture and Swipe Gesture)?手势方法(平移手势和滑动手势)之间是否有任何优先条件? 【发布时间】:2011-02-02 13:55:52 【问题描述】:

我正在开发一个应用程序,其中我使用了平移手势和滑动手势。因此,每次我执行滑动手势时,总是会调用 Pan Gesture 中的方法,而不会调用 Swipe Gesture 方法。

所有手势方法之间是否有优先级?

【问题讨论】:

【参考方案1】:

您可以通过实现UIGestureRecognizerDelegate协议的以下方法来并行调用它们:

- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer

    return YES;

【讨论】:

我正在使用“github.com/XavierDK/XDKAirMenu”并且还在我的一个控制器中使用滑动手势,所以这个代表对我不起作用【参考方案2】:

UIGestureRecognizer 类中有一个名为“cancelsTouchesInView”的属性,默认为YES。这将导致取消任何挂起的手势。 Pan 手势首先被识别,因为它不需要“touch up”事件,因此它取消了 Swipe 手势。

如果您希望两种手势都能被识别,请尝试添加:

[yourPanGestureInstance setCancelsTouchesInView:NO];

【讨论】:

感谢您的回答,但此方法仍然无法识别滑动手势 我也尝试了 UIGestureRecognizer.H 文件中的 shouldRecognizeSimultaneouslyWithGestureRecognizer 方法【参考方案3】:

优先滑动

您可以使用require(toFail:) 方法为UIGestureRecognizer 赋予优先级。

@IBOutlet var myPanGestureRecognizer: UIPanGestureRecognizer!
@IBOutlet var mySwipeGestureRecognizer: UISwipeGestureRecognizer!

myPanGesture.require(toFail: mySwipeGestureRecognizer)

现在你的 pan 只会在你的 swipe 失败时执行。


使用 pan 处理一切

如果 swipepan 手势识别器不能很好地使用此设置,您可以将所有逻辑滚动到 pan手势识别器以获得更多控制。

let minHeight: CGFloat = 100
let maxHeight: CGFloat = 700
let swipeVelocity: CGFloat = 500
var previousTranslationY: CGFloat = 0

@IBOutlet weak var cardHeightConstraint: NSLayoutConstraint!

@IBAction func didPanOnCard(_ sender: Any) 

    guard let panGesture = sender as? UIPanGestureRecognizer else  return 

    let gestureEnded = bool(panGesture.state == UIGestureRecognizerState.ended)
    let velocity = panGesture.velocity(in: self.view)

    if gestureEnded && abs(velocity.y) > swipeVelocity 
        handlePanOnCardAsSwipe(withVelocity: velocity.y)
     else 
        handlePanOnCard(panGesture)
    
 

func handlePanOnCard(_ panGesture: UIPanGestureRecognizer) 

    let translation = panGesture.translation(in: self.view)
    let translationYDelta = translation.y - previousTranslationY

    if abs(translationYDelta) < 1  return  // ignore small changes

    let newCardHeight = cardHeightConstraint.constant - translationYDelta

    if newCardHeight > minHeight && newCardHeight < maxHeight 
        cardHeightConstraint.constant = newCardHeight
        previousTranslationY = translation.y
    

    if panGesture.state == UIGestureRecognizerState.ended 
        previousTranslationY = 0
    


func handlePanOnCardAsSwipe(withVelocity velocity: CGFloat) 
    if velocity.y > 0 
        dismissCard() // implementation not shown
     else 
        maximizeCard() // implementation not shown
    

这是上述代码的演示。

【讨论】:

以上是关于手势方法(平移手势和滑动手势)之间是不是有任何优先条件?的主要内容,如果未能解决你的问题,请参考以下文章

平移手势和滑动手势

在不干扰平移的情况下向 MKMapView 添加左滑动手势

在视图控制器之间平移(不滑动)

滑动和平移手势重叠

是否可以禁用滑动手势并仅使平移手势在滚动视图中工作?

如何在半视图上实现滑动手势和在另一半视图上实现平移手势?