Obtener la location táctil de uicollectionviewcell

Estoy intentando localizar el toque dentro del UICollectionviewCell seleccionado. Tengo un UIViewController, vc, que contiene una UICollectionView, collectionView, como su vista. Dentro de la colección View hay UICollectionViewCells. La vc se ajusta a UICollectionViewDelegate así que preferiblemente me gustaría get la location tocada dentro de la callback de delegado collectionView:(UICollectionView *)collection didSelectItemAtIndexPath:(NSIndexPath *)indexPath , (si es posible). ¿Alguna recomendación sobre cómo hacer eso? Gracias.

 +--------------------------------------------+ | UICollectionView | | | | +-------------+ +-------------+ | | | UICollec | | | | | | tionView | | | | | | Cell | | *<---------------<Touch here | | | | | | | +-------------+ +-------------+ | | | +--------------------------------------------+ 

* ACTUALIZACIÓN * Terminé detectando el toque en UIViewCollectionView usando el UIGestureRecognizer y luego convirtiendo el punto de toque en la vista UICollectionViewCell . Por favor, hágamelo saber si hay una mejor manera. Gracias.

 -(void) viewDidLoad { UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; [tapGesture setNumberOfTapsRequinetworking:1]; [self.collectionView addGestureRecognizer:tapGesture]; } -(void) handleTap:(UIGestureRecognizer*) gesture { if (gesture.state == UIGestureRecognizerStateEnded) { CGPoint tappedPoint = [gesture locationInView:_collectionView]; NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:tappedPoint]; CollectionViewCell *cell = (CollectionViewCell*)[self.collectionView cellForItemAtIndexPath:indexPath]; CGPoint pointWRTCell = [cell convertPoint:tappedPoint fromView:self.collectionView]; NSLog(@"collectionView point(%1.1f,%1.1f); cell point (%1.1f,%1.1f)", tappedPoint.x,tappedPoint.y,pointWRTCell.x,pointWRTCell.y); } } 

Es probable que necesite una célula personalizada para hacer esto. didSelectItemAtIndexPath solo le dice que se seleccionó una celda. No donde se tocó dentro de la celda.

UIView tiene un método func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? . Para get el punto de contacto, puede anular este método en la vista de colección o en la celda de vista de colección.

Y hay methods como func convertPoint(_ point: CGPoint, toView view: UIView?) -> CGPoint para que usted convierta el punto en diferentes sistemas de coorderadas.

Obtenga indexPath para probar este código …

 (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellId" forIndexPath:[indexPath row]]; [[cell myButton] addTarget:self action:@selector(myClickEvent:event:) forControlEvents:UIControlEventTouchUpInside]; return cell; } (IBAction)myClickEvent:(id)sender event:(id)event { NSSet *touches = [event allTouches]; UITouch *touch = [touches anyObject]; CGPoint currentTouchPosition = [touch locationInView:_myCollectionArray]; NSIndexPath *indexPath = [_myCollectionArray indexPathForItemAtPoint: currentTouchPosition]; } 

Debe agregar la propiedad para save la location táctil en UICollectionViewCell.

 @interface YourCollectionViewCell : UICollectionViewCell @property (nonatomic, assign) CGPoint touchPoint; @end 

A continuación, agregue el evento de touchesBegan en YourCollectionViewCell.m

 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; self.touchPoint = [[touches anyObject] locationInView:self]; } 

Finalmente, puede usar el touchPoint en su UICollectionView

 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { YourCollectionViewCell * cell = [collectionView cellForItemAtIndexPath:indexPath]; NSLog(@"touch location %f, %f", cell.touchPoint.x, cell.touchPoint.y); } 

Creo que es la forma más fácil de get la location táctil. Y lo estoy usando en mis códigos.