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是未公开的,因此子类检查.
此方法位于您指定为手势识别器的委托的类中.如果您刚刚开始使用手势识别器,请注意该代理与目标分开设置.
UIGestureRecognizerDelegate有一个名为"gestureRecognizer:shouldReceiveTouch"的方法.如果你能够指出触摸的视图是否是按钮,只需让它返回"否",否则返回"是",你就可以了.
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也会执行动作.如果这不打扰你,那么这将是我能想到的最简单的解决方案.
| 归档时间: |
|
| 查看次数: |
9134 次 |
| 最近记录: |