在 UICollectionView 中使用 LongPressGesture 检索 UICollectionViewCell 的 NSIndexPath 和部分

Posted

技术标签:

【中文标题】在 UICollectionView 中使用 LongPressGesture 检索 UICollectionViewCell 的 NSIndexPath 和部分【英文标题】:Retrieve NSIndexPath of UICollectionViewCell with LongPressGesture in UICollectionView with section 【发布时间】:2013-09-26 15:23:22 【问题描述】:

我正在尝试使用单元格上的 UIImageView 上的 UILongPressGestureRecognizer 检索 UICollectionViewCell 的 NSIndexPath,有时工作,完全适用于集合视图的第一项,但是当我滚动 UICollectionView 时,我按下单元格检索我是 UICollectionViewCell 的第一项,而不是我按下的,在其他情况下返回 nil,我该如何解决这个问题?这是代码:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

...
UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onLongPress:)];
        longPressRecognizer.minimumPressDuration = 1.0;
        [cell.imgView setUserInteractionEnabled:YES];
        [cell.imgView addGestureRecognizer:longPressRecognizer];
...


-(void)onLongPress:(UILongPressGestureRecognizer*)gestureRecognizer


    if(UIGestureRecognizerStateBegan == gestureRecognizer.state) 
        NSLog(@"began");
        NSLog(@"%2.f %.2f",[gestureRecognizer locationInView:self.view].x,[gestureRecognizer locationInView:self.view].y);
        NSIndexPath *item = [self.collectionView indexPathForItemAtPoint:[gestureRecognizer locationInView:self.view]];
        NSLog(@"%d - %d",item.row,item.section);
        MyCell *cell = (MyCell *)[self.collectionView cellForItemAtIndexPath:item];
        NSLog(@"%@",cell.myLabel.text);
      

【问题讨论】:

如果self.view != self.collectionView 那么你应该使用locationInView:self.collectionView 非常感谢它有效,如果你创建一个答案我可以接受它:) 顺便说一句,您可能只想创建一个手势识别器,然后将其附加到UICollectionView 本身,而不是附加到单个图像。不仅你最终得到的手势识别器要少得多(因此可能更高效),而且如果你不小心,你的代码可能会导致多个手势识别器用于成功出列和重用的单元格(尤其是在使用单元格原型的情况下) ,其中很难区分该单元是否被重复使用,或者它是否实例化了一个新单元)。 【参考方案1】:

如果您的 view 与您的 collectionView 不是同一个实例,那么当您调用 [gestureRecognizer locationInView:self.view] 时,您会在错误的坐标空间中得到一个点。这将导致您在请求索引路径时得到不准确的响应。

所以,你应该使用

[gestureRecognizer locationInView:self.collectionView]

【讨论】:

以上是关于在 UICollectionView 中使用 LongPressGesture 检索 UICollectionViewCell 的 NSIndexPath 和部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中使用 @resultbuilder 使用 UICollectionView?

我可以在 1 UICollectionView 中使用 collectionViewCell 2 Cell 吗?

如何使用 UIViewControllerRepresentable 在 SwiftUI 中呈现 UICollectionView

在 UICollectionView 中使用 reloadData 时如何从重新加载中排除标头

如何使用 Alamofire 在 UICollectionView 单元格中使用标签显示图像?

在 UINavigationController 中使用 UICollectionView 缩放动画