Objective c uibarbuttonim和uigesture识别器

Objective c uibarbuttonim和uigesture识别器,objective-c,uigesturerecognizer,Objective C,Uigesturerecognizer,我有一个ui视图,其中我添加了一个ui动作识别器: UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)]; tapRecognizer.numberOfTapsRequired=1; tapRecognizer.numberOfTouchesRequired=1; [self.myView addGest

我有一个
ui视图
,其中我添加了一个
ui动作识别器

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
tapRecognizer.numberOfTapsRequired=1;
tapRecognizer.numberOfTouchesRequired=1;
[self.myView addGestureRecognizer:tapRecognizer];
然后,我将带有按钮的
UIToolBar
添加到视图中:

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];
我遇到了一个问题,我点击注销按钮,我的点击识别器触发,而不是我的注销操作。如果我单击并按住,则注销操作将启动(我猜tap识别器失败,因此让对接操作启动)


按下按钮时,我如何才能不启动手势识别器?

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


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

实现UIgestureRecognitor的此委托方法(记住设置TapRecogniter.delegate=self)


只是有同样的问题。因为我不想引入容器视图(UIToolbar应该包含我现有的视图)。在Patrick.Ji粗粗的指点下,我得出了以下结论:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view.superview isKindOfClass:[UIToolbar class]]) {
        return NO;
    }
    return YES;
}
不要忘记将手势的代表设置为
self

- (void)viewDidLoad {
    [super viewDidLoad];
    UITapGestureRecognizer *mainTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mainTapGesture:)];
    mainTapGestureRecognizer.delegate = self;
    [self.view addGestureRecognizer:mainTapGestureRecognizer];
}

识别器的视图始终是myView。我正在tapDetected:方法中检查它。如果没有其他办法,我会使用内容视图。那不行。
UIBarbuttonItem
不是
UIView
子类。因此,触摸的观点永远不会属于那种类型。当显示时,
UIBarButtonItem
在其中传输的UIView子类是私有类(例如,
UIToolbarButton
uitoolbertextbutton
),我讨厌使用这种方法,但它包含在内。谢谢
- (void)viewDidLoad {
    [super viewDidLoad];
    UITapGestureRecognizer *mainTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mainTapGesture:)];
    mainTapGestureRecognizer.delegate = self;
    [self.view addGestureRecognizer:mainTapGestureRecognizer];
}