如何找到 UICollectionViewCell 相对于应用程序窗口的坐标

Posted

技术标签:

【中文标题】如何找到 UICollectionViewCell 相对于应用程序窗口的坐标【英文标题】:How to find a UICollectionViewCell's coordinates relative to the App Window 【发布时间】:2012-11-25 18:44:46 【问题描述】:

是否可以将UICollectionViewCell's 坐标从相对于UICollectionView 转换为相对于superview?到目前为止,当触摸到superview 时,我无法翻译UICollectionViewCell's 坐标。到目前为止,这是我尝试过的:

- (void)collectionView:(UICollectionView *)collectionView  
        didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
    UICollectionViewCell *cell = 
     [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" 
                                               forIndexPath:indexPath];

    CGRect frame = CGRectMake(0.0, 
                              0.0,  
                              cell.frame.size.width, 
                              cell.frame.size.height);
    frame.origin = [cell convertPoint:cell.frame.origin 
                               toView:self.view];

我想创建一个新框架,该框架源自视图上单元格的位置,而不是UICollectionView。任何帮助都会非常感谢。

【问题讨论】:

上面的代码给你什么结果?那你用框架做什么呢? 生成的框架给了我一个相对于 UICollectionView 原点的原点。例如,如果一个单元格在向左滚动 5000 点后被触摸,则转换后的帧原点为 5000, 0。 计算完位置后,我想将坐标传递给子视图以显示在触摸单元格的顶部。 【参考方案1】:

这个答案很晚,但希望它会对某人有所帮助。 丹,你的想法是对的,但比你拥有的更容易。直接替换

CGRect frame = CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height);
frame.origin = [cell convertPoint:cell.frame.origin toView:self.view];

CGRect frame = [collectionView convertRect:cell.frame toView:self.view];

问题是您在单元格上调用转换方法,而不是在 collectionView 上。

【讨论】:

完美。在此之前,我认真地尝试了其他 50 件事。谢谢。 #latenightprogramming 哇,谢谢!我一直试图只调用 convertTo() 而不在某个对象上调用它,不知道为什么它不起作用。傻我哈哈!【参考方案2】:

如果我理解正确,我认为问题在于您首先必须更正滚动视图的contentOffset,这很容易做到,因为UICollectionViewUIScrollView 的子类。

CGRect frame = CGRectMake(0.0,
                          0.0,
                          cell.frame.size.width,
                          cell.frame.size.height);
CGPoint correctedOffset = 
 CGPointMake(cell.frame.origin.x - collectionView.contentOffset.x,
             cell.frame.origin.y - collectionView.contentOffset.y);
frame.origin = [cell convertPoint:correctedOffset toView:self.view];

我在我的一个UICollectionView 演示应用程序中对此进行了测试,它似乎有效。试试看吧。

【讨论】:

【参考方案3】:

以防万一有人在寻找这个,这里是如何在 Swift 中完成的:

let cellFrameInSuperview = collectionView.convertRect(collectionView.cellForItemAtIndexPath(indexPath)!.frame, toView: view)

【讨论】:

以上是关于如何找到 UICollectionViewCell 相对于应用程序窗口的坐标的主要内容,如果未能解决你的问题,请参考以下文章

调整 UICollectionViewCell 以适应内容

如何设置 UICollectionViewCell 的位置?

如何在 UICollectionViewCell 上设置 UILabel?

如何保存 UICollectionViewCell 的状态

UICollectionViewCell 重用导致不正确的 UISwitch 状态

如何使文本字段与 UICollectionViewCell 一样大?