首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UITapGestureRecognizer阻止子视图中的UIButton触摸事件

UITapGestureRecognizer阻止子视图中的UIButton触摸事件
EN

Stack Overflow用户
提问于 2016-09-19 02:35:50
回答 2查看 5K关注 0票数 4

我相信我对UITapGestureRecognizer有一个问题,因为当我在聊天室敲击键盘时,会阻止或阻止对previewCancelButton的触摸。以下是我的相关代码:

BaseTemplateVC.m

代码语言:javascript
运行
复制
- (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];
}

ChattomVC.m

代码语言:javascript
运行
复制
- (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

代码语言:javascript
运行
复制
- (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“,当我追溯时,我发现BaseTemplatVC.m包含addDismissKeyboardGesture方法,所以我相信这可能会导致问题。

任何人都可以指导我找到一些解决办法。我会很感激的。提前谢谢。

进步:,我已经在ChattomVC.m中修改了gestureRecognizer方法,所以现在它可以忽略按钮上的点击手势,但是问题仍然存在,因为按钮没有被触发。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 13:32:00

通过在GestureRecogniser委托方法中使用下面的代码,我找到了一个解决方案:

代码语言:javascript
运行
复制
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
  if ([touch.view isDescendantOfView:IFView.stickerPreviewView]) {
     return NO;
  }
     return YES;
}

它确切地指定了在本例中IFView.stickerPreviewView将返回NO的子视图。在InputFunctionView中,也可以使用它来添加子视图:

代码语言:javascript
运行
复制
[self.superview addSubview:_stickerPreviewView];
票数 1
EN

Stack Overflow用户

发布于 2016-09-19 03:17:51

试一试,我想它会成功的。使用手势的shouldReceiveTouch委托方法,当touch.view是按钮类时,不返回。因此,当它找到按钮时,它将放弃手势并采取按钮操作。

代码语言:javascript
运行
复制
- (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;
}

这里是演示实现: --我已经在故事板中的视图控制器的主视图上使用了按钮。

代码语言:javascript
运行
复制
- (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");
}

希望能帮上忙。快乐的编码..。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39564613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档