9

是否有可能將UICollectionViewCell's的座標從相對於UICollectionView的位置轉換爲相對於superview?到目前爲止,我一直無法將UICollectionViewCell's座標翻譯爲superview。以下是我試過到目前爲止:如何查找相對於應用程序窗口的UICollectionViewCell的座標

- (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。任何幫助將非常感謝。

+0

什麼結果並上面的代碼給你?你在框架上做什麼? – jrturton

+0

生成的框架給了我一個相對於UICollectionView原點的起源。例如,如果一個單元在向左滾動5000個點後被觸摸,則轉換後的幀原點將爲{5​​000,0}。 –

+0

當我計算出位置後,我想將座標傳遞給子視圖以顯示在被觸摸的單元格的頂部。 –

回答

33

這個答案很晚,但希望它能幫助別人。丹,你有正確的想法,但它更容易,你有什麼。只需更換

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的轉換方法。

+0

完美。在此之前,我認真嘗試了其他50件事。謝謝。 #latenightprogramming –

+0

完美,謝謝! – revton

3

如果我理解正確,我認爲問題在於您首先必須糾正滾動視圖的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演示應用程序的一個測試這一點,它似乎工作。試一試。

1

以防萬一,如果有人在找這個,這裏是它如何在斯威夫特來完成:

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