获取 uicollectionviewcell 的触摸位置

Posted

技术标签:

【中文标题】获取 uicollectionviewcell 的触摸位置【英文标题】:getting touch location of uicollectionviewcell 【发布时间】:2014-04-07 23:09:03 【问题描述】:

我正在尝试获取所选内容中的触摸位置 UICollectionViewCell。我有一个 UIViewController,vc,包含一个 UICollectionView,collectionView,作为它的视图。 collectionView 内部是 UICollectionViewCells。 vc 符合UICollectionViewDelegate,所以最好我想在委托回调中获取触摸位置,collectionView:(UICollectionView *)collection didSelectItemAtIndexPath:(NSIndexPath *)indexPath,(如果可能的话)。关于如何做到这一点的任何建议?谢谢。

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

*更新* 我最终使用UIGestureRecognizer 检测到UIViewCollectionView 上的点击,然后将点击点转换为UICollectionViewCell 视图。请让我知道是否有更好的方法。谢谢。

-(void) viewDidLoad 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [tapGesture setNumberOfTapsRequired: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);
    

【问题讨论】:

【参考方案1】:

您可能需要一个自定义单元格来执行此操作。 didSelectItemAtIndexPath 只告诉您选择了一个单元格。不是在牢房内被触及的地方。

【讨论】:

感谢您的回复。子类化 'UICollectionView' 可能有效。我最终使用了“UITabGestureRecognizer”并将点击的位置从“UICollectionView”转换为“UICollectionViewCell” 一些上下文可能会帮助我们提出更好的解决方案。您要解决的问题是什么? 我只是想在用户点击单元格的特定位置(不是单元格本身)时删除一个单元格 啊!最简单的事情可能是创建一个自定义 UICollectionViewCell ,其中包含一个按钮并具有弱委托引用。让您的控制器成为代表。单元格可以有一个 indexPath 属性(确保每次都在 cellForRowAtIndexPath 中设置它以避免单元格重用错误)。当按下按钮时,让它调用委托上的方法(类似于deleteButtonPressed:(id)sender atIndexPath:(NSIndexPath *)indexPath; 刚刚看到你的更新。该解决方案似乎有点脆弱,但我想它使您无法进行子类化,这总是很好的。我曾经通过在运行时添加按钮并将索引路径作为关联属性附加到 UITableViewCell 上来完成类似的操作。【参考方案2】:

UIView 有一个方法func hitTest(point: CGPoint, withEvent event: UIEvent?) -&gt; UIView?。要获取接触点,您可以在集合视图或集合视图单元格中覆盖此方法。

还有func convertPoint(_ point: CGPoint, toView view: UIView?) -&gt; CGPoint之类的方法可以让你在不同的坐标系中转换点。

【讨论】:

【参考方案3】:

获取 indexPath 以尝试此代码..

(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];


【讨论】:

【参考方案4】:

您应该在 UICollectionViewCell 中添加用于保存触摸位置的属性。

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

然后在YourCollectionViewCell.m中添加touchesBegan的事件

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

    [super touchesBegan:touches withEvent:event];
    self.touchPoint = [[touches anyObject] locationInView:self];

最后,你可以在你的 UICollectionView 中使用 touchPoint

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    YourCollectionViewCell * cell = [collectionView cellForItemAtIndexPath:indexPath];
    NSLog(@"touch location %f, %f", cell.touchPoint.x, cell.touchPoint.y);

我认为这是获取触摸位置的更简单方法。我在我的代码中使用它。

【讨论】:

以上是关于获取 uicollectionviewcell 的触摸位置的主要内容,如果未能解决你的问题,请参考以下文章

如何获取选定的 UICollectionViewCell?

从自定义 UICollectionViewCell 获取正确的按钮

为啥我的 UICollectionViewCell 没有从 UICollectionViewController 获取数据?

Xamarin iOS:从情节提要中的 UICollectionViewCell 获取信息

自动布局:无法获取 UICollectionViewCell 子视图的帧大小

如何根据单元格文本获取 UICollectionViewCell 的 indexPath?