Reputation: 2583
Is it possible to translate a UICollectionViewCell's
coordinates from being relative to the UICollectionView
to being relative to the superview
? So far I've been unable to translate a UICollectionViewCell's
coordinates when touched to the superview
. Here's what I've tried so far:
- (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];
}
I'd like to create a new frame which originates from the cell's position on the view, not in the UICollectionView
. Any help would be great thanks.
Upvotes: 10
Views: 12288
Reputation: 379
Just in case if anybody looking for this, here is how it can be done in Swift:
let cellFrameInSuperview = collectionView.convertRect(collectionView.cellForItemAtIndexPath(indexPath)!.frame, toView: view)
Upvotes: 3
Reputation: 1913
If I understand you correctly, I think the problem is that you first have to correct for the scroll view's contentOffset
, which is easy to do since UICollectionView
is a subclass of 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];
I tested this in one of my UICollectionView
demo apps and it seems to work. Give it a try.
Upvotes: 4
Reputation: 378
This answer is very late, but hopefully it will help someone. Dan, you have the right idea, but it is even easier that what you have. Just replace
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];
with
CGRect frame = [collectionView convertRect:cell.frame toView:self.view];
The problem was that you were calling the convert method on the cell, not the collectionView.
Upvotes: 36