Gostaria de pressionar uma vez a UITableViewCell
para imprimir um "menu de acesso rápido". Alguém já fez isso?
Particularmente o gesto reconhece UITableView
?
Gostaria de pressionar uma vez a UITableViewCell
para imprimir um "menu de acesso rápido". Alguém já fez isso?
Particularmente o gesto reconhece UITableView
?
Primeiro, adicione o reconhecedor de gestos de pressão longa à exibição da tabela:
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];
Em seguida, no manipulador de gestos:
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
CGPoint p = [gestureRecognizer locationInView:self.myTableView];
NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
NSLog(@"long press on table view at row %ld", indexPath.row);
} else {
NSLog(@"gestureRecognizer.state = %ld", gestureRecognizer.state);
}
}
Você deve ter cuidado com isso para que não interfira com o toque normal da célula no usuário e também observe que handleLongPress
pode disparar várias vezes (isso ocorrerá devido às alterações de estado do reconhecedor de gestos).
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) ...
.UITableView
, e não aoUITableViewCell
...)Eu usei a resposta de Anna-Karenina e funciona quase perfeitamente com um bug muito sério.
Se você estiver usando seções, pressionar longamente o título da seção fornecerá um resultado errado ao pressionar a primeira linha dessa seção. Adicionei uma versão fixa abaixo (incluindo a filtragem de chamadas falsas com base no estado do gesto, por Sugestão de Anna-Karenina).
fonte
Resposta em Swift 5 (continuação da resposta de Ricky em Swift)
fonte
Aqui estão as instruções esclarecidas combinando a resposta de Dawn Song e a de Marmor.
Arraste um longo Press Gesture Recognizer e solte-o na sua célula da tabela. Irá pular para o final da lista à esquerda.
Em seguida, conecte o reconhecedor de gestos da mesma maneira que conectaria um botão.
Adicione o código do Marmor no manipulador de ações
}
fonte
Parece ser mais eficiente adicionar o reconhecedor diretamente à célula, como mostrado aqui:
Toque e segure para células TableView, então e agora
(role até o exemplo na parte inferior)
fonte
Resposta em Swift:
Adicione delegado
UIGestureRecognizerDelegate
ao seu UITableViewController.No UITableViewController:
E a função:
fonte
Montei uma pequena categoria no UITableView com base na excelente resposta de Anna Karenina.
Assim, você terá um método de delegação conveniente, como está acostumado ao lidar com visualizações de tabela regulares. Confira:
Se você deseja usar isso em um UITableViewController, provavelmente precisará subclassificar e estar em conformidade com o novo protocolo.
Funciona muito bem para mim, espero que ajude os outros!
fonte
Resposta Swift 3, usando sintaxe moderna, incorporando outras respostas e eliminando códigos desnecessários.
fonte
Basta adicionar UILongPressGestureRecognizer à célula de protótipo fornecida no storyboard e puxar o gesto para o arquivo .m do viewController para criar um método de ação. Eu fiz como eu disse.
fonte
Use a propriedade de carimbo de data / hora do UITouch em touchesBegan para iniciar um timer ou pará-lo quando toquesEnded foi demitido
fonte