如何获取收藏夹视图中所选项目的位置?

时间:2019-02-05 07:29:14

标签: ios swift uicollectionview

在我的项目中,有一个用户网格。我使用集合视图制作了网格。当用户点击单元格时,我需要选定单元格的位置或框架。我曾经使用过触摸事件视图,但是在集合视图中无法使用。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first!
    let location = touch.location(in: self.view)
    print(location)
}

当您触摸其余的UIView期望collectionView项目时,此方法也适用。

6 个答案:

答案 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