我在滚动视图中嵌入了一个UICollectionView:
每个白色方块都是一个集合视图单元格。用户可以水平滚动以显示其他单元格。
当用户点击一个单元格时,我创建了一个动画,当一个转换到新的视图控制器时,该动画会使该单元格从其自身的中心向外扩展。
以下是代码:
//cell is selected:
//grab snapshot of cell
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
UIImage *cellImage = [self imageOfCollectionCell:cell];
//hold the snapshot in this dict
NSMutableDictionary *cellImageDict = [[NSMutableDictionary alloc]init];
[cellImageDict setObject:cellImage forKey:SELECTED_INBOX_EMAIL_IMAGE];
[ViewControllerSnapShotDictionary sharedInstance].vcdict = nil;
[ViewControllerSnapShotDictionary sharedInstance].vcdict = cellImageDict;
//get the center of the cell (HERE IS WHERE THE PROBLEM IS)
CGPoint cellCenter = CGPointMake(cell.center.x, cell.center.y);
//do the animation using the snapshot and cell center
[self startPinchingOutCellFromCenterPoint:cellCenter forTransitionTo:emailController withSnapShotImage:SELECTED_INBOX_EMAIL_IMAGE];
代码工作正常,如果集合视图已滚动,则除外。动画要求我知道单元格的中心在屏幕上的位置,被触摸以及相对于我正在查看的视图坐标的位置。
例如,如果尚未滚动集合视图,并且我选择上面图像的中心单元格,则中心可能会返回:
cell.center.x = 490
cell.center.y = 374
但是,如果我向右滚动,然后选择新的中心单元格,我可能会得到类似的结果:
cell.center.x = 1770
cell.center.y = 374
我的问题是,是否有更好的方法来完成我想要做的事情,或者有没有办法处理单元格的中心,因为它位于self.view中的当前位置? / p>
答案 0 :(得分:3)
我认为这是因为中心坐标位于collectionView的坐标系(滚动)中。您需要将其转换为不滚动的坐标系。
尝试这样的事情:
CGPoint realCenter = [collectionView convertPoint:cell.center
toView:collectionView.superview];
它的作用基本上是将中心从collectionView的坐标系转换为它的父级,应该是固定的(不是滚动)。
您甚至可以通过传递nil作为参数来获取屏幕(窗口)上的坐标:
CGPoint realCenter = [collectionView convertPoint:cell.center
toView:nil];
由您决定要转换的坐标。