Objective-C
Em seu myCollectionViewController.h
arquivo, adicione o UIGestureRecognizerDelegate
protocolo
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
em seu myCollectionViewController.m
arquivo:
- (void)viewDidLoad
{
// attach long press gesture to collectionView
UILongPressGestureRecognizer *lpgr
= [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.delegate = self;
lpgr.delaysTouchesBegan = YES;
[self.collectionView addGestureRecognizer:lpgr];
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
return;
}
CGPoint p = [gestureRecognizer locationInView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
UICollectionViewCell* cell =
[self.collectionView cellForItemAtIndexPath:indexPath];
// do stuff with the cell
}
}
Rápido
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .Ended {
return
}
let p = gesture.locationInView(self.collectionView)
if let indexPath = self.collectionView.indexPathForItemAtPoint(p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
Swift 4
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .ended {
return
}
let p = gesture.location(in: self.collectionView)
if let indexPath = self.collectionView.indexPathForItem(at: p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItem(at: indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
referência aqui espero que tudo isso mereça uma resposta correta Prêmio: Dlpgr.delaysTouchesBegan = YES;
para evitar quedidHighlightItemAtIndexPath
seja disparado primeiro.lpgr.delegate = self;
? Ele funciona bem sem delegado, que você também não forneceu.UIGestureRecognizerStateBegan
, para que o gesto seja usado quando for reconhecido, não quando o usuário soltar o dedo.O mesmo código @ código de abbood para Swift:
Em viewDidLoad:
E a função:
Não se esqueça do delegado
UIGestureRecognizerDelegate
fonte
UIGestureRecognizerState.Ended
paraUIGestureRecognizerState.Began
se quiser que o código seja disparado depois que a duração mínima tiver passado, não apenas quando o usuário pegar o dedo.Use o delegado de UICollectionView para receber evento de imprensa longa
Você deve implantar o 3 método abaixo.
fonte
As respostas aqui para adicionar um reconhecedor de gestos de toque longo personalizado estão corretas, no entanto, de acordo com a documentação aqui : a classe pai da
UICollectionView
classe instala umdefault long-press gesture recognizer
para lidar com as interações de rolagem, portanto, você deve vincular seu reconhecedor de gestos de toque personalizado ao reconhecedor padrão associado à sua visualização de coleção.O código a seguir evitará que o reconhecedor de gestos personalizado interfira com o padrão:
fonte
The parent class of UICollectionView class installs a default tap gesture recognizer and a default long-press gesture recognizer to handle scrolling interactions. You should never try to reconfigure these default gesture recognizers or replace them with your own versions.
então o reconhecedor de pressionamento longo padrão é feito para rolagem .. o que implica que deve ser acompanhado por um movimento vertical .. o OP não está perguntando sobre esse tipo de comportamento e ele não está tentando substituí-loe adicione o método como este.
fonte
Para ter um reconhecedor de gestos externo e não entrar em conflito com os reconhecedores de gestos internos no UICollectionView, você precisa:
Adicione seu reconhecedor de gestos, configure-o e capture uma referência para ele em algum lugar (a melhor opção está em sua subclasse se você criou uma subclasse de UICollectionView)
Substituir métodos de inicialização padrão
initWithFrame:collectionViewLayout:
einitWithCoder:
e adicionar configurar método para você pressão longa gesto reconhecedorEscreva seu método de configuração para instanciar o reconhecedor de gestos de toque longo, definir seu delegado, configurar dependências com o reconhecedor de gestos UICollectionView (para que seja o gesto principal e todos os outros gestos esperarão até que o gesto falhe antes de serem reconhecidos) e adicione o gesto à visualização
Também não se esqueça de implementar os métodos UIGestureRecognizerDelegate que falham nesse gesto e permitir o reconhecimento simultâneo (você pode ou não precisar implementá-lo, isso depende de outros reconhecedores de gesto que você tem ou dependências com reconhecedores de gesto internos)
credenciais para isso vão para a implementação interna de LXReorderableCollectionViewFlowLayout
fonte
Swift 5:
Além disso, não se esqueça de implementar UIGestureRecognizerDelegate e chamar setupLongGestureRecognizerOnCollection de viewDidLoad ou onde quer que você precise chamá-lo.
fonte
Talvez, usar UILongPressGestureRecognizer seja a solução mais difundida. Mas eu encontro com ele dois problemas irritantes:
Deixe-me sugerir um pouco de força bruta, mas funcionando como é obrigatório, sugestão:
Declarando uma descrição de retorno de chamada para um clique longo em nosso celular:
typealias OnLongClickListener = (view: OurCellView) -> Void
Estendendo UICollectionViewCell com variáveis (podemos chamá-lo de OurCellView, por exemplo):
Adicionando dois métodos em nossa classe de célula:
E substituindo eventos de toque aqui:
Então, em algum lugar no controlador de nossa visualização de coleção declarando listener de retorno de chamada:
E, finalmente, em cellForItemAtIndexPath definindo callback para nossas células:
Agora podemos interceptar longas ações de clique em nossas células.
fonte