单击手势识别器覆盖的UINavigationBar中的事件

Oct*_*ape 16 uinavigationbar uitableview uigesturerecognizer ios

首先问题是:

当你有一个tableView如何实现,用户可以点击NavigationBar一直滚动到顶部.

解:

- (void)viewDidLoad {
    UITapGestureRecognizer* tapRecon = [[UITapGestureRecognizer alloc]
              initWithTarget:self action:@selector(navigationBarDoubleTap:)];
    tapRecon.numberOfTapsRequired = 2;
    [navController.navigationBar addGestureRecognizer:tapRecon];
    [tapRecon release];
}

- (void)navigationBarDoubleTap:(UIGestureRecognizer*)recognizer {
    [tableView setContentOffset:CGPointMake(0,0) animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力!

但德拉罗克指出了一个问题:

只有在没有后退按钮或rightBarButtonItem时,此方法才可行.他们的点击事件被手势识别器覆盖

我的问题:

我怎样才能拥有可导航栏可点击的漂亮功能,但仍然可以使用我的应用程序中的后退按钮?

所以要么找到一个不会覆盖后退按钮的不同解决方案,要么找到一个解决方案让后退按钮重新工作:)

Ben*_*ynn 15

我没有使用位置视图,而是通过检查UITouch的类来解决这个问题.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return (![[[touch view] class] isSubclassOfClass:[UIControl class]]);
}
Run Code Online (Sandbox Code Playgroud)

请注意,导航按钮的类型UINavigationButton是未公开的,因此子类检查.

此方法位于您指定为手势识别器的委托的类中.如果您刚刚开始使用手势识别器,请注意该代理目标分开设置.

  • 似乎不适用于后退按钮.按下后退按钮时[[触摸视图]类]也是UINavigationBar (9认同)

Sta*_*ash 7

UIGestureRecognizerDelegate有一个名为"gestureRecognizer:shouldReceiveTouch"的方法.如果你能够指出触摸的视图是否是按钮,只需让它返回"否",否则返回"是",你就可以了.


Den*_*nis 5

UIGestureRecognizer也有一个属性@property(nonatomic) BOOL cancelsTouchesInView.从文档:A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.

所以,如果你只是这样做

tapRecon.cancelsTouchesInView = NO;
Run Code Online (Sandbox Code Playgroud)

这可能是一个更简单的解决方案,具体取决于您的用例.这是我在我的应用程序中执行此操作的方式.

当按下导航栏中的按钮时,会执行其动作(根据需要),但UIGestureRecognizer也会执行动作.如果这不打扰你,那么这将是我能想到的最简单的解决方案.