9

È possibile convertire le coordinate di UICollectionViewCell's da quelle relative allo UICollectionView in modo relativo allo superview? Finora non sono stato in grado di tradurre le coordinate UICollectionViewCell's quando sono state toccate su superview. Ecco quello che ho provato finora:Come trovare le coordinate di UICollectionViewCell relative alla finestra dell'applicazione

- (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]; 
} 

Mi piacerebbe creare un nuovo telaio che ha origine dalla posizione della cella nella vista, non nel UICollectionView. Qualsiasi aiuto sarebbe fantastico, grazie.

+0

Che risultato non il codice di cui sopra ti danno? Cosa stai facendo allora con la cornice? – jrturton

+0

Il frame risultante mi dà un'origine relativa all'origine di UICollectionView. Ad esempio, se una cella è stata toccata dopo essere stata scorsa di 5000 punti verso sinistra, l'origine del fotogramma dopo la conversione sarà {5000, 0}. –

+0

Dopo aver calcolato la posizione, vorrei passare le coordinate ad una sottoview da visualizzare sopra la parte superiore della cella toccata. –

risposta

33

Questa risposta è molto tardi, ma si spera che possa aiutare qualcuno. Dan, hai l'idea giusta, ma è ancora più facile quello che hai. Basta sostituire

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]; 

con

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

Il problema era che si stava chiamando il metodo convertito sulla cellula, non il CollectionView.

+0

Perfezione. Ho provato seriamente altre 50 cose prima di questo. Grazie. #latenightprogramming –

+0

Perfetto, grazie! – revton

3

Se ho capito bene, penso che il problema è che devi prima correggere lo scroll della vista contentOffset, che è facile da fare poiché UICollectionView è una sottoclasse di UIScrollView.

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]; 

Ho provato questo in uno dei miei UICollectionView applicazioni demo e sembra funzionare. Provaci.

1

Solo nel caso se qualcuno alla ricerca di questo, ecco come si può fare a Swift:

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