首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIBarButtonItem和UIGestureRecognizer

UIBarButtonItem和UIGestureRecognizer
EN

Stack Overflow用户
提问于 2012-12-21 02:06:19
回答 3查看 1.6K关注 0票数 2

我有一个在其中添加了UITapGestureRecognizerUIView

代码语言:javascript
复制
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
tapRecognizer.numberOfTapsRequired=1;
tapRecognizer.numberOfTouchesRequired=1;
[self.myView addGestureRecognizer:tapRecognizer];

然后,我将一个带有按钮的UIToolBar添加到视图中:

代码语言:javascript
复制
UIToolbar *topBar = [[UIToolbar alloc ]initWithFrame:CGRectMake(0, 0, self.myView.frame.size.width, 44)];
topBar.barStyle = UIBarStyleBlackTranslucent;

UIBarButtonItem *logout = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleBordered target:self action:@selector(logout)];

[topBar setItems:@[logout] animated:NO];

我有一个问题,当我点击注销按钮,我的点击识别器触发,而不是我的注销操作。如果我点击并按住,那么注销操作就会触发(我猜是点击识别器失败了,所以让按钮操作触发)。

当按钮被按下时,我如何不触发手势识别器?

EN

回答 3

Stack Overflow用户

发布于 2013-02-19 13:12:12

只是遇到了同样的问题。因为我不想引入容器视图( UIToolbar应该覆盖我现有的视图)。在Patrick.Ji粗略地指出的帮助下,我想出了这个:

代码语言:javascript
复制
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view.superview isKindOfClass:[UIToolbar class]]) {
        return NO;
    }
    return YES;
}

不要忘记将手势的委托设置为self

代码语言:javascript
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    UITapGestureRecognizer *mainTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mainTapGesture:)];
    mainTapGestureRecognizer.delegate = self;
    [self.view addGestureRecognizer:mainTapGestureRecognizer];
}
票数 4
EN

Stack Overflow用户

发布于 2012-12-21 02:20:37

检查点击识别器中的视图。如果是您的注销按钮,让触摸无法通过super将其传递到链上。

或者,确保工具栏不是视图的子视图。相反,让容器视图包含工具栏和内容视图,并将手势识别器添加到此内容视图中。

票数 0
EN

Stack Overflow用户

发布于 2012-12-23 13:43:31

实现UIGestureRecognizer的这个委托方法(记得设置tapRecognizer.delegate = self)

代码语言:javascript
复制
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:   (UITouch *)touch {

    if ([touch.view isKindOfClass:[UIBarButtonItem class]]) 
    {
        return NO;
    }
    return YES;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13977973

复制
相关文章

相似问题

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