苹果公司的“移动人机界面指导方针”关于Popovers的解释:
尽可能让用户只需一次点击就能关闭一个弹出窗口并打开另一个。当多个不同的工具栏按钮都会打开弹出窗口时,这种行为尤其可取,因为它可以避免用户进行额外的点击。
目前我唯一能想到的解决方案是,在关闭弹出窗口时跟踪触摸位置,并检查该位置是否是另一个按钮的位置。有没有更简单的方法?
PS:在发布之前,我在stackoverflow和谷歌上搜索了很长时间。如果此问题以前曾在这里提问过,请见谅。
更新
我想我没有很好地解释自己。假设我有三个按钮。它们都会打开一个弹出窗口。用户点击按钮#1,一个弹出窗口打开了。在弹出窗口打开时,用户点击了按钮#2。弹出窗口关闭(因为用户在弹出窗口外点击了一下 - 这是非模式弹出窗口的默认行为),并打开一个新的弹出窗口,因为用户已经点击了按钮#2。所有这些都无需两次点击:一次关闭弹出窗口,两次打开新的弹出窗口。
第二次更新
我建立了一个简单的虚拟模型来复制我想要做的事情。当用户点击按钮并打开弹出窗口时,打开弹出窗口的方法不会被调用。因此,用户必须点击两次才能打开第二个弹出窗口。有什么想法吗?
#import "RootViewController.h"
#import "AViewController.h"
@interface RootViewController()
@property (nonatomic, retain) UIPopoverController *currentPopover;
@end
@implementation RootViewController
@synthesize currentPopover;
- (void)loadView
{
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
UIView *view = [[UIView alloc] initWithFrame:applicationFrame];
CGRect buttonFrame = CGRectMake(50, 100, 200, 40);
for (int i = 0; i < 3; i++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:[NSString stringWithFormat:@"Button %i", i + 1] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openPopover:) forControlEvents:UIControlEventTouchDown];
[button setFrame:buttonFrame];
[view addSubview:button];
buttonFrame.origin.y += 50;
}
self.view = view;
[view release];
}
- (IBAction)openPopover:(id)sender
{
AViewController *avc = [[AViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:avc];
[avc release];
UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:navigationController];
[tempPopover setDelegate:self];
[tempPopover setPopoverContentSize:CGSizeMake(320, 500)];
[tempPopover presentPopoverFromRect:[sender frame] inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
self.currentPopover = tempPopover;
[tempPopover release];
[navigationController release];
}
- (void)dealloc
{
[currentPopover release];
[super dealloc];
}
@end