在我的项目中,有一个用户网格。我使用集合视图制作了网格。当用户点击单元格时,我需要选定单元格的位置或框架。我曾经使用过触摸事件视图,但是在集合视图中无法使用。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first!
let location = touch.location(in: self.view)
print(location)
}
当您触摸其余的UIView期望collectionView项目时,此方法也适用。
答案 0 :(得分:3)
在UICollectionView
委托中有一种方法可以实现您想要的功能,您可以使用它来找出单击了哪个单元格:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
YourCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
let frame = cell.layer.frame
// here you can do what you want with frame
// ...
}
答案 1 :(得分:2)
indexPathsForSelectedItems 返回一个索引路径数组(因为可能选择了多个项目),因此您需要使用:
let indexPaths : NSArray = self.collectionView!.indexPathsForSelectedItems()
let indexPath : NSIndexPath = indexPaths[0] as NSIndexPath
(您可能应该测试一下是否选择了多个项目,并进行相应的处理)。
答案 2 :(得分:1)
您可以使用以下方法获取单元格属性
func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
然后使用frame属性获取框架
let attributes = self.collectionView.layoutAttributesForItem(at:indexPath)
let frame = attributes.frame
PS-您可能必须将单元格的框架从UICollectionView转换为控制器的视图才能获得其确切位置。
func convert(_ rect: CGRect,
from view: UIView?) -> CGRect
应该做到这一点
答案 3 :(得分:0)
谢谢大家的良好反应,我找到了解决方法。
int
当您打印let cell = collectionView.cellForItem(at: indexPath) as! MyCollectionViewCell
let tap = CGPoint(x: 0, y: 0)
let convertedTap = cell.convert(tap, to: self.view)
时,您将获得收集项目单元格相对于视图的确切位置。
答案 4 :(得分:0)
基本上,您需要使用:
let cPoint = collectionView.layoutAttributesForItem(at indexPath: IndexPath).center
但是之后,您需要像这样将点转换为视图的坐标系:
let centerPoint = collectionView.convert(center ?? CGPoint.zero, to: collectionView.superview)
这是完整的代码段:
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let attributes = self.collectionView?.layoutAttributesForItem(at:indexPath)
let cPoint = attributes?.center
/*
this is nice. but when we scroll passed the visible items -
we see that the point is given in the collectionView's coordinates.
we need to convert the point to the collectionView.superview coordinate system
*/
//solution:
let centerPoint = collectionView.convert(cPoint, to: collectionView.superview)
}
答案 5 :(得分:0)
非常容易。 快速将该位置称为索引路径。 当您在collectionview中选择特定的单元格时,其位置由索引路径标识
/// initialise确实在视图控制器中选择了功能
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.item)!")
}
//注意 您可以在“ cellforItematIndexpath”函数中获取indexpath