获取 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?) -> UIView?
。要获取接触点,您可以在集合视图或集合视图单元格中覆盖此方法。
还有func convertPoint(_ point: CGPoint, toView view: UIView?) -> 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 没有从 UICollectionViewController 获取数据?
Xamarin iOS:从情节提要中的 UICollectionViewCell 获取信息