Feche o Popover e abra um novo com um toque
-
29-10-2019 - |
Pergunta
As "Diretrizes de interface humana móvel" da Apple dizem sobre Popovers:
Quando possível, permita que as pessoas fechem um popover e abram um novo com um toque. Este comportamento é especialmente desejável quando vários botões de barra diferentes abrem um popover, porque evita que as pessoas de ter que fazer toques extras.
A única solução que posso pensar agora é rastrear a posição do toque ao dispensar o popover e verificar se essa era a posição de outro botão. Existe alguma maneira mais fácil de fazer isso?
PS: Eu pesquisei no stackoverflow e pesquisei um pouco antes de postar. Desculpe, se isso foi perguntado aqui antes.
< PaulUPDATE
Acho que não me expliquei bem. Digamos que tenho três botões. Todos eles abrem um popover. Meu usuário toca no botão 1 e um popover é aberto. Enquanto o popover está aberto, o usuário toca no botão # 2. O popover é descartado (porque o usuário tocou fora do popover - comportamento padrão dos popovers não modais) e um novo popover é aberto porque o usuário clicou no botão # 2. Tudo isso sem ter que tocar duas vezes: uma para dispensar o popover e duas vezes para abrir o novo.
2ª ATUALIZAÇÃO
Construí um manequim simples para reproduzir o que estou tentando fazer. Quando o usuário toca em um botão e um popover é aberto, o método que abre os popovers não é chamado. Portanto, o usuário deve clicar duas vezes para abrir o segundo popover. Alguma ideia?
#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
Solução
Se você usar itens do botão da barra em uma barra de ferramentas, o popover aberto não é fechado automaticamente quando você toca em outro item do botão da barra.Nessas situações, você deve fechar o popover visível e abrir o outro em uma etapa.
Outras dicas
- (IBAction)sortAction {
[searchBarView resignFirstResponder];
[self.popoverController dismissPopoverAnimated:YES]; //clear popover
self.popoverController = popoverSetting;
[self.popoverController presentPopoverFromBarButtonItem:sortBarButtonItem
permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; //show popover
}
espero que ajude você
Digamos que você tenha 3 botões e cada um abre um pop-up.Você pode usar uma variável de estado que rastreia se um pop-up está aberto no momento e, dentro de cada método de "pop-up aberto", feche o existente (se estiver aberto) antes de abrir o novo pop-up.