C objetivo
En su myCollectionViewController.h
archivo agregue el UIGestureRecognizerDelegate
protocolo
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
en su myCollectionViewController.m
archivo:
- (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))
Rápido 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];
referencia aquí espero que todo esto merezca un premio de respuesta correcta: Dlpgr.delaysTouchesBegan = YES;
para evitar que se activedidHighlightItemAtIndexPath
primero.lpgr.delegate = self;
? Funciona bien sin delegado, que tampoco ha proporcionado.UIGestureRecognizerStateBegan
, por lo que el gesto se usa cuando se reconoce, no cuando el usuario suelta el dedo.El mismo código de @ abbood para Swift:
En viewDidLoad:
Y la función:
No te olvides del delegado
UIGestureRecognizerDelegate
fuente
UIGestureRecognizerState.Ended
aUIGestureRecognizerState.Began
si desea que el código se active una vez que haya pasado la duración mínima, no solo cuando el usuario levante el dedo.Utilice el delegado de UICollectionView para recibir un evento de pulsación prolongada
Debe implicar el método 3 a continuación.
fuente
Las respuestas aquí para agregar un reconocedor de gestos personalizado de pulsación larga son correctas, sin embargo, de acuerdo con la documentación aquí : la clase de
UICollectionView
clase principal instala undefault long-press gesture recognizer
para manejar las interacciones de desplazamiento, por lo que debe vincular su reconocedor de gestos de toque personalizado al reconocedor predeterminado asociado con su vista de colección.El siguiente código evitará que su reconocedor de gestos personalizado interfiera con el predeterminado:
fuente
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.
por lo que el reconocedor de pulsación larga predeterminado está hecho para desplazarse ... lo que implica que tiene que ir acompañado de un movimiento vertical ... el OP no pregunta sobre ese tipo de comportamiento ni está tratando de reemplazarloy agregue el método así.
fuente
Para tener un reconocedor de gestos externo y no entrar en conflicto con los reconocedores de gestos internos en UICollectionView, debe:
Agregue su reconocedor de gestos, configúrelo y capture una referencia para él en algún lugar (la mejor opción está en su subclase si subclasificó UICollectionView)
Por defecto reemplazar los métodos de inicialización
initWithFrame:collectionViewLayout:
yinitWithCoder:
ejemplo y agregue establecieron método para usted pulsación larga reconocedor gestoEscriba su método de configuración para que instancia el reconocedor de gestos de pulsación prolongada, configure su delegado, configure las dependencias con el reconocedor de gestos UICollectionView (para que sea el gesto principal y todos los demás gestos esperarán hasta que ese gesto falle antes de ser reconocido) y agregue el gesto a la vista
Además, no olvide implementar los métodos UIGestureRecognizerDelegate que fallan en ese gesto y permiten el reconocimiento simultáneo (puede o no necesitar implementarlo, depende de otros reconocedores de gestos que tenga o dependencias con reconocedores de gestos internos)
credenciales para eso va a la implementación interna de LXReorderableCollectionViewFlowLayout
fuente
Rápido 5:
Además, no olvide implementar UIGestureRecognizerDelegate y llamar a setupLongGestureRecognizerOnCollection desde viewDidLoad o donde sea que necesite llamarlo.
fuente
Quizás, usar UILongPressGestureRecognizer es la solución más extendida. Pero me encuentro con dos problemas molestos:
Permítanme sugerir uno un poco de fuerza bruta, pero funcionando como se requiere sugerencia:
Declarando una descripción de devolución de llamada para un clic largo en nuestra celda:
typealias OnLongClickListener = (view: OurCellView) -> Void
Extendiendo UICollectionViewCell con variables (podemos llamarlo OurCellView, por ejemplo):
Añadiendo dos métodos en nuestra clase de celda:
Y eventos táctiles predominantes aquí:
Luego, en algún lugar del controlador de nuestra vista de colección declarando el oyente de devolución de llamada:
Y finalmente en cellForItemAtIndexPath configurando la devolución de llamada para nuestras celdas:
Ahora podemos interceptar acciones de clic largo en nuestras celdas.
fuente