1

我相信我在UITapGestureRecognizer中关于在聊天室区域阻止或阻止触摸到previewCancelButton时关闭键盘的问题。这里下面是我的相关代码:UITapGestureRecognizer在子视图中阻止UIButton的触摸事件

BaseTemplateVC.m

- (void)addDismissKeyboardGesture { 

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)]; 
    tapGesture.cancelsTouchesInView = NO; 
    tapGesture.delegate = self; 
    self.view.tag = 111; 
    [self.view addGestureRecognizer:tapGesture]; 
} 

- (void) dismissKeyboard:(id)sender { 
    UITapGestureRecognizer *gesture = sender; 
    UIView *view = gesture.view; 
    NSLog(@"%ld", (long)view.tag); 
    [self.view endEditing:YES]; 
} 

ChatroomVC.m

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 

    //Disallow recognition of tap gestures in the segmented control. 
    if (([touch.view isKindOfClass:[UIButton class]])) { 
     NSLog(@"noooooooo"); 
     return NO; 
    } 
    return YES; 
    NSLog(@"yesssssss"); 
} 

InputFunctionView.m

- (void)selectedSticker:(NSString *)stickerURLString { 

    /* Sticker preview subview */ 
    stickerPreviewView = [[UIImageView alloc] initWithFrame:CGRectMake(0, -120, FrameWidth, 120)]; 
    stickerPreviewView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f]; 
    stickerPreviewView.userInteractionEnabled = YES; 
    [self addSubview:stickerPreviewView]; 
    [self bringSubviewToFront:stickerPreviewView]; 

    /* Initialise previewCancelButton */ 
    self.previewCancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    self.previewCancelButton.frame = CGRectMake(Main_Screen_Width-30, SpaceForItems-120, 20, 20); 
    [self.previewCancelButton setBackgroundImage:[UIImage imageNamed:@"btn_previewcancel.png"] forState:UIControlStateNormal]; 
    [self.previewCancelButton setBackgroundImage:[UIImage imageNamed:@"btn_previewcancel.png"] forState:UIControlStateHighlighted]; 

    [self.previewCancelButton addTarget:self action:@selector(cancelStickerPreviewButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

    [self addSubview: self.previewCancelButton]; 

} 

/* Cancel sticker preview subview */ 
- (void)cancelStickerPreviewButtonPressed:(id)sender { 

    NSLog(@"cancel sticker preview"); 
    [self.previewCancelButton removeFromSuperview]; 
    [stickerPreviewView removeFromSuperview]; 

} 

现在,previewCancelButton正确显示在stickerPreviewView的右上角,但无法接收触摸事件。当我触摸按钮时,它在控制台中显示“111”,当我追溯到时发现包含addDismissKeyboardGesture方法的BaseTemplateVC.m,所以我认为这可能会导致问题。

任何人都可以指导我解决一些问题。那真的很感激。提前致谢。 enter image description here

进展:我在ChatroomVC.m所以现在可以忽略轻敲姿势上的按钮,但问题仍然是按钮动作不被解雇修改gestureRecognizer方法。

+0

可以在手势操作功能检查按区域和编程按与'.sendAction'按钮和rightaway返回,如果它在按钮区域 – Tj3n

+0

@ Tj3n我不确定如何检查按钮的点按区域。你能用代码告诉我,所以我能明白你的意思吗?谢谢。 – SanitLee

+0

你可以请检查剪辑绑定到是,看看你的按钮仍然可见 –

回答

1

我找到了解决这个在GestureRecogniser委托方法使用下面的代码:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isDescendantOfView:IFView.stickerPreviewView]) { 
    return NO; 
    } 
    return YES; 
} 

它指定在这种情况下IFView.stickerPreviewView是返回NO正是子视图。此外,在InputFunctionView,用这个来代替添加子视图:

[self.superview addSubview:_stickerPreviewView]; 
2

只要试试这个,我想它会奏效。 使用shouldReceiveTouch手势代表方法,返回NOtouch.view是按钮类。 所以当它找到按钮它会放弃手势并采取按钮操作。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    // Block the recognition of tap gestures in the button. 
    if (([touch.view isKindOfClass:[UIButton class]])) { 
     return NO; 
    } 

    return YES; 
} 

这里是演示实现: 我已在故事板视图控制器的主视图按钮。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureClicked:)]; 
    tapGesture.delegate = self; 
    [self.view addGestureRecognizer:tapGesture]; 
} 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    // Disallow recognition of tap gestures in the segmented control. 
    if (([touch.view isKindOfClass:[UIButton class]])) { 
     return NO; 
    } 
    return YES; 
} 
- (IBAction)btnTestClicked:(UIButton *)sender { 
    NSLog(@"test button click"); 
} 

- (void)tapGestureClicked:(UIGestureRecognizer *)recog 
{ 
    NSLog(@"tap gesture clicked"); 
} 

希望它有帮助。 快乐编码...

+0

我实际上不想放弃原始手势,而只是在stickerPreviewView子视图中为previewCancelButton添加触摸识别。 – SanitLee

+0

它会像你想要的那样。当你点击按钮时,它将不返回手势,这将导致手势动作不会被触发,因此按钮动作会被触发。当你在手势区域内按钮以外时,它会调用手势方法。 – Janmenjaya

+0

那么我应该把你的代码放到我现有的代码中?请多多包涵;我很初学。谢谢。 – SanitLee

相关问题