在 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 时如何从重新加载中排除标头