我的 iPad 应用程序主屏幕顶部有一个 UIToolbar。它上面有 6 个 UIBarButtonItems。其中 4 个项目触发 UIPopOvers 出现。其他 2 个项目要么切换到不同的视图,要么更改当前视图的某些内容。
4 个 UIPopOver 中的 3 个从轻按的 UIBarButtonItem 中出现,第 4 个出现在屏幕中间,没有箭头。
我想要以下功能,但很难使用它:
- 当没有显示 UIPopOver 并且用户点击生成 UIPopOver 的 UIBarButtonItems 之一时,显示 UIPopOver(很简单;让它工作。)
- 当显示 UIPopOver 并且用户点击 UIToolbar 时,关闭该 UIPopOver。(使用需要点击 1 次的 UIGestureRecognizer 来完成这项工作。)
- 当显示 UIPopOver 并且用户点击 UIBarButtonItem 到哪个 UIPopOver 被“绑定”时,关闭 UIPopOver。(这是我的问题。)
- 当显示 UIPopOver 并且用户点击另一个 UIBarButtonItem 时,关闭当前 UIPopOver 并显示适当的新 UIPopOver。(这工作正常。)
所以,我面临的问题是 UIGestureRecognizer 在按钮点击之前触发。当用户按下 UIBarButtonItem 时,我也找不到“选择退出” UIGestureRecognizer 的好方法(因此,只有在点击 UIToolbar 本身时才触发 UIGestureRecognizer 的操作,而不是 UIBarButtonItem)。这样做的最终结果是,当显示 UIPopOver(来自 UIBarButtonItem)并且用户点击相同的 UIBarButtonItem 时,UIPopOver 被解除,然后再次显示。
我试图避免某种时间问题,我将“toolbarTapped”标志设置为 YES 0.10 秒,然后将其设置回 NO(或类似的东西)。
我想找到一种方法来真正优雅地做到这一点(而不是 hack-y)。
我似乎无法找到一种方法来确定何时基于 UIBarButtonItem 触摸触发 UIGestureRecognizer,因为 UIGestureRecognizer 首先触发并且似乎没有一种好的(非私有)方法来获取 UIBarButtonItem 的框架。
基本上,我正在尝试使 UIToolbar 及其 UIBarButtonItems 的行为符合任何合理的人所期望的方式,但我正在把头撞到墙上。
这是 UIGestureRecognizer 的代码:
// Initialization
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeAllPopOvers)];
[tapRecognizer setCancelsTouchesInView:NO];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setNumberOfTouchesRequired:1];
[[self Toolbar] addGestureRecognizer:tapRecognizer];
// Tap handler
- (void)removeAllPopOvers {
NSLog(@"removing all popovers");
if ([self firstPopOver]) {
[[self firstPopOver] dismissPopoverAnimated:YES];
[self setFirstPopOver:nil];
}
// and so on with the rest...
}
这是我的 UIPopOver 之一的显示方式:
- (IBAction)showSettings:(id)sender {
NSLog(@"settings button tapped");
if (![self SettingsPopOver]) {
SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:@"SettingsView-iPad" bundle:nil];
UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:settingsVC];
[popOver setDelegate:self];
[self setSettingsPopOver:popOver];
[[self SettingsPopOver] setPopoverContentSize:CGSizeMake(320, 300)];
[[self SettingsPopOver] presentPopoverFromBarButtonItem:[self Settings] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
}
所有这一切的最终结果是我可以选择以下两个选项之一(但不能同时选择两者):
- 允许 UIBarButtonItem 关闭 UIPopOver。
- 允许点击 UIToolbar 以关闭 UIPopOver。
有任何想法吗?
谢谢!