双击UINavigationController导航栏?

3

我有一个包含大量数据列表的应用程序,我想通过双击navigationBar将UITableView滚动到列表顶部(搜索位置)。

我该如何实现这个功能?

谢谢您的帮助。


你也可以简单地点击状态栏,它会自动回到tableView的顶部。无需编写代码。 - Souljacker
2个回答

16

将tableView滚动到顶部的标准手势是单击状态栏。默认情况下启用此功能,请参阅UIScrollView Reference

如果您真的需要导航栏并且目标是3.2或更高版本,我建议将一个UITapGestureRecognizer附加到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];
}

如果你的目标版本是3.0或更低,可能会有些棘手,不建议使用。


1
标准行为是单次轻触,而不是双击。 - Alan Rogers
2
我试图为单击添加一个轻拍识别器。如果您没有返回按钮或rightBarButtonItem,则此方法是可行的。它们的点击事件将被手势识别器覆盖。 - Drarok
我不想失礼,但是Drarok是正确的,使用这种方法后我无法再使用返回按钮了。有没有办法让它们重新工作?求帮助 :) - Octoshape
是的,你说得对。这在navigationBar中不适用于按钮。很抱歉我没有看到此问题的解决方案。也许有其他人能提供帮助? - tonklon
嗯,我会把它做成一个新的问题并链接到这个问题上,不认为人们仍然在这里阅读它。 - Octoshape
查看我的解决方案(适用于单击),适用于导航栏中的按钮:https://dev59.com/gXI95IYBdhLWcg3w8y6N#21288149 - Ortwin Gentz

9

继续上面tonklon的回答,你可以通过获取navigationBar视图的子视图来区分其中的各个元素。

navigationBar的子视图包括:

0 左按钮, 1 标题, 2 右按钮。

所以不是:

[navController.navigationBar addGestureRecognizer:tapRecon];

为导航栏标题执行以下操作:

[[self.navigationController.navigationBar.subviews objectAtIndex:1] setUserInteractionEnabled:YES];
[[self.navigationController.navigationBar.subviews objectAtIndex:1] addGestureRecognizer:tapRecon];

两个问题:1)titleView 的高度比导航栏小。2)如果有多个左侧按钮,子视图索引可能会发生变化(未经测试)。这里是另一种解决方案:https://dev59.com/gXI95IYBdhLWcg3w8y6N#21288149 - Ortwin Gentz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接