【问题标题】:UILongPressGestureRecognizer didn't workUILongPressGestureRecognizer 不起作用
【发布时间】:2013-12-24 14:23:13
【问题描述】:

我在 UIImageView 中添加了 4 个手势识别器,单击、双击和固定手势都可以正常工作。但是,长按手势不起作用。这是为什么呢?

        _imageView.userInteractionEnabled = YES ;

    //single tap
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc ]initWithTarget:self action:@selector(singleTapAction:) ]  ;
    singleTap.numberOfTapsRequired = 1 ;
    singleTap.numberOfTouchesRequired = 1 ;

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapAction:)] ;
    doubleTap.numberOfTouchesRequired = 1 ;
    doubleTap.numberOfTapsRequired = 2 ;
    [singleTap requireGestureRecognizerToFail:doubleTap] ;

    //pin gesture
    UIPinchGestureRecognizer  *pin = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)] ;

    //long press gesture
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:) ] ;
    [longPress requireGestureRecognizerToFail:singleTap ] ;
    longPress.minimumPressDuration = 1 ;
    longPress.numberOfTouchesRequired = 1 ;
    longPress.numberOfTapsRequired = 1 ;

    [_imageView addGestureRecognizer:longPress] ;
    [_imageView addGestureRecognizer:pin] ;
    [_imageView addGestureRecognizer:singleTap] ;
    [_imageView addGestureRecognizer:doubleTap] ;


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

大家好,我添加了 shouldRecognizeSimultaneouslyWithGestureRecognizer 方法并设置了长按 gesutre 委托,但这仍然不起作用。

【问题讨论】:

标签: ios objective-c uigesturerecognizer


【解决方案1】:

你的错误可能在这里

[longPress requireGestureRecognizerToFail:longPress ] ;

为什么 longPress 要求自身失败?删除它。

你不懂 requireGestureRecognizerToFail 命令。它在手势需要其他未能触发时使用。如果 longPress 未触发,则触发 tapGesture。 在你的情况下捏失败->长按失败->双击失败->单击 同时删除这一行: longPress.numberOfTapsRequired = 1 ;

注释掉你的代码并使用这个代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.imageView.userInteractionEnabled = YES;
    self.imageView.multipleTouchEnabled = YES;
    UIGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = 1 ;
    longPress.numberOfTouchesRequired = 1 ;
    [longPress requireGestureRecognizerToFail:pinchGesture];

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    doubleTap.numberOfTouchesRequired = 1;
    doubleTap.numberOfTapsRequired = 2;
    [doubleTap requireGestureRecognizerToFail:longPress];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    singleTap.numberOfTouchesRequired = 1;
    singleTap.numberOfTapsRequired = 1;
    [singleTap requireGestureRecognizerToFail:doubleTap];

    [self.imageView addGestureRecognizer:pinchGesture];
    [self.imageView addGestureRecognizer:longPress];
    [self.imageView addGestureRecognizer:doubleTap];
    [self.imageView addGestureRecognizer:singleTap];

}

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gesture{
    NSLog(@"Pinch");
}


- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture{
    NSLog(@"LongPress");
}

- (void)handleDoubleTap:(UITapGestureRecognizer *)gesture{
    NSLog(@"Double Tap");
}

- (void)handleSingleTap:(UITapGestureRecognizer *)gesture{
    NSLog(@"Single Tap");
}

【讨论】:

  • 对不起,我原来的代码是[longPress requireGestureRecognizerToFail:singleTap ] ;,我把这行代码删了,长按还是不行。
  • 错了!使用 [singleTap requireGestureRecognizerToFail:longPress];
【解决方案2】:

尝试使用这个委托方法:-

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

你也错过了这个:- longPress.delegate = self;

【讨论】:

  • 添加这个:- longPress.delegate = self;
【解决方案3】:

为了使长按手势识别器工作,单击手势识别器必须首先失败。

在您的代码中,您指定长按手势识别器本身是必须失败的(这是错误的)。你应该改变:

[longPress requireGestureRecognizerToFail:longPress ] ;

到:

[longPress requireGestureRecognizerToFail:singleTap ] ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多