【发布时间】:2015-03-21 05:13:58
【问题描述】:
我的 iPad 应用程序主屏幕顶部有一个 UIToolbar。它上面有 6 个 UIBarButtonItems。其中 4 个项目触发 UIPopOvers 出现。其他 2 项要么切换到不同的视图,要么更改当前视图的某些内容。
4 个 UIPopOver 中的 3 个从轻按的 UIBarButtonItem 中出现,第 4 个出现在屏幕中间没有箭头。
我想要以下功能,但无法使用:
- 当没有显示 UIPopOver 并且用户点击生成 UIPopOver 的 UIBarButtonItem 之一时,显示 UIPopOver(很简单;让它工作。)
- 当显示 UIPopOver 并且用户点击 UIToolbar 时,关闭该 UIPopOver。 (使用需要点击 1 次的 UIGestureRecognizer 来完成这项工作。)
- 当显示 UIPopOver 并且用户点击 UIPopOver 被“绑定”到的 UIBarButtonItem 时,关闭 UIPopOver。 (这就是我的问题。)
- 当显示 UIPopOver 并且用户点击另一个 UIBarButtonItem 时,关闭当前 UIPopOver 并显示适当的新 UIPopOver。 (这工作正常。)
所以,我面临的问题是 UIGestureRecognizer 在按钮点击之前触发。当用户按下 UIBarButtonItem 时,我也找不到“选择退出” UIGestureRecognizer 的好方法(因此,仅在点击 UIToolbar 本身时触发 UIGestureRecognizer 的操作,而不是 UIBarButtonItem)。这样做的最终结果是,当显示 UIPopOver(来自 UIBarButtonItem)并且用户点击相同的 UIBarButtonItem 时,UIPopOver 被解除,然后再次显示。
我试图避免某种时间问题,我将“toolbarTapped”标志设置为 YES 0.10 秒,然后将其设置回 NO(或类似的东西)。
我想找到一种方法来真正优雅地做到这一点(而不是 hack-y)。
我似乎无法找到一种方法来确定 UIGestureRecognizer 何时根据 UIBarButtonItem 触摸触发,因为 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。
有什么想法吗?
谢谢!
【问题讨论】:
标签: ios uigesturerecognizer uitoolbar uipopover