GestureRecognizer 的动作不会触发

The action of GestureRecognizer does not fire

我添加手势查看的步骤如下:

@interface iCarousel () <UIGestureRecognizerDelegate>  
{ 
     UIPanGestureRecognizer * mPanGesture;  
     UITapGestureRecognizer * mTapGesture; 
}
@end  
@implementation iCarousel
- (void)setUp  
{
    _contentView = [[UIView alloc] initWithFrame:self.bounds];  

    _contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;  

    /  
    mPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(iCarouselDidPan:)];  
    mPanGesture.delegate = self;  
    [_contentView addGestureRecognizer:mPanGesture];  

    /  
    mTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(iCarouselDidTap:)];  
    mTapGesture.delegate = self;  
    [_contentView addGestureRecognizer:mTapGesture];  

    /  
    self.accessibilityTraits = UIAccessibilityTraitAllowsDirectInteraction;  
    self.isAccessibilityElement = YES;  

    [self addSubview:_contentView];  
} 
- (id)initWithCoder:(NSCoder *)aDecoder  
{  
    if ((self = [super initWithCoder:aDecoder]))  
    {  
        [self setUp];  
    }  
    return self;  
}  

- (id)initWithFrame:(CGRect)frame  
{  
    if ((self = [super initWithFrame:frame]))  
    {  
        [self setUp];  
    }  
    return self;  
}  

...  


- (void)iCarouselDidTap:(UITapGestureRecognizer *)tapGesture  
{  
     ...  
}  


- (void)iCarouselDidPan:(UIPanGestureRecognizer *)panGesture  
{  
     ...  
}  

...  

@end  

现在,class

中的方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gesture

return 我是

但是,iCarouselDidPan: 和 iCarouselDidTap: 动作不会触发。

信息以gestureRecognizerShouldBegin:方式打印。

(lldb) po _contentView.gestureRecognizers 
<__NSArrayI 0x1572bec0>(  
<UIPanGestureRecognizer: 0x16dea750; state = Possible; view = <UIView 0x16dea640>; target= <(action=iCarouselDidPan:, target=<iCarousel 0x16dea1b0>)>>,
<UITapGestureRecognizer: 0x16e8f310; state = Possible; view = <UIView 0x16dea640>; target= <(action=iCarouselDidTap:, target=<iCarousel 0x16dea1b0>)>> 
)  
(lldb) po gesture 
<UIPanGestureRecognizer: 0x16dea750; state = Possible; view = <UIView 0x16dea640>; target= <(action=iCarouselDidPan:, target=<iCarousel 0x16dea1b0>)>> 

目前仅发生在 <4s 9.3.x , 5 10.3.1> 设备上。

尝试在您的 iCarousel 中实施协议 UIGestureRecognizerDelegate 的以下方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
       shouldReceiveTouch:(UITouch *)touch {

    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
       shouldReceivePress:(UIPress *)press {

    return YES;
}

在 .h 文件中声明 UIGestureRecognizerDelegate

手势定义

-(UITapGestureRecognizer*)setTapGesture{

    UITapGestureRecognizer *Tap = [[UITapGestureRecognizer alloc]
                                           initWithTarget:self action:@selector(handleTapWithGestureRecognizer:)];
    Tap.delegate = self;
    return Tap;

}
-(void)handleTapWithGestureRecognizer:(UITapGestureRecognizer *)TapGestureRecognizer{
    NSLog(@"tap Gesture");
}

-(UIPanGestureRecognizer*)setpanGesture{

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    [panRecognizer setMinimumNumberOfTouches:1];
    [panRecognizer setMaximumNumberOfTouches:1];
    return panRecognizer;

}
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {

    [self.view bringSubviewToFront:recognizer.view];
     CGPoint touchLocation = [recognizer locationInView:self.view];
     self.YOURVIEW.center = touchLocation;
}

调用 Gesture 或向您的视图添加手势

[self.YOURVIEW addGestureRecognizer:[self setTapGesture]];
[self.YOURVIEW addGestureRecognizer:[self setpanGesture]];

self.YOURVIEW.userInteractionEnabled = YES;

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

祝你好运 快乐编码。

无效手势的可能情况。

1 - 您需要启用视图交互。

 [_contentView setUserInteractionEnabled:YES];

2 - 在您的 class 中添加此代表。

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