【问题标题】:Method to make UIGestureRecognizer fail after being recognized?UIGestureRecognizer被识别后失败的方法?
【发布时间】:2011-11-12 09:27:14
【问题描述】:

我有一个问题可能看起来很基本但无法弄清楚。

基本问题是:当手势识别器处于 UIGestureRecognizerStateBegan 或 UIGestureRecognizerStateChanged 时,如何以编程方式将手势识别器置于处理程序的失败状态?

更详细的解释:我在 UIScrollView 中有一个用于 UIView 的长按手势识别器。我做了

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

因为否则一旦用户将手指放在视图上,我就无法滚动滚动视图。这是像 safari 一样的基本触摸,您在链接上按住手指,这会突出显示链接,但向上或向下滚动 - 然后链接不突出显示并且滚动视图移动。

由于两种手势都被识别,我现在可以大部分工作,但如果我可以检测到 longpress 手势识别器的 StateChanged 中的运动会更好,如果它超过 20 像素左右,只需以编程方式使 longpress 失败。

这可能吗?还是我挖错地方了?

【问题讨论】:

    标签: ios uiscrollview uigesturerecognizer


    【解决方案1】:

    我发布问题后发现的另一个问题..

    这是我现在在手势识别器处理程序中所做的:

    else if (sender.state == UIGestureRecognizerStateChanged) {
        CGPoint newTouchPoint = [sender locationInView:[self superview]];
    
        CGFloat dx = newTouchPoint.x - initTouchPoint.x;
        CGFloat dy = newTouchPoint.y - initTouchPoint.y;
        if (sqrt(dx*dx + dy*dy) > 25.0) {
            sender.enabled = NO;
            sender.enabled = YES;
        }
    }
    

    因此,如果手指在任何方向上移动超过 25 个像素,将 enabled 属性设置为 NO 将使识别器失败。所以这将完成我想要的!

    【讨论】:

    • 通过在将 sender.enabled 设置为 NO 后立即将其设置为 YES,您真的在做什么吗?将其设置为 NO 似乎在这里什么都不做。您的意思是在 IF 语句之前将 sender.enabled 设置为 YES 吗?
    【解决方案2】:

    如果是UILongPressGestureRecognizer,只需设置其allowableMovement 属性即可。

    UILongPressGestureRecognizer* recognizer = [your recognizer];
    recognizer.allowableMovement = 25.0f;
    

    【讨论】:

      【解决方案3】:

      根据文档,您可以对手势识别器进行子类化:

      在 YourPanGestureRecognizer.m 中:

      #import "YourPanGestureRecognizer.h"
      
      @implementation YourPanGestureRecognizer
      
      - (void) cancelGesture {
          self.state=UIGestureRecognizerStateCancelled;
      }
      
      @end
      

      在 YourPanGestureRecognizer.h 中:

      #import <UIKit/UIKit.h>
      #import <UIKit/UIGestureRecognizerSubclass.h>
      
      @interface NPPanGestureRecognizer: UIPanGestureRecognizer
      
      - (void) cancelGesture;
      
      @end
      

      现在你可以从任何地方拨打电话

      YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)];
      [self.view addGestureRecognizer:panRecognizer];
      [...]
      -(void) panMoved:(YourPanGestureRecognizer*)sender {
          [sender cancelGesture]; // This will be called twice
      }
      

      参考:https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多