我正在使用UICollectionView
制作一个大网格,我希望它可以缩放(整个UICollectionView
,而不仅仅是一个单元格),标准捏合到 - 缩放手势。有问题的网格有一个自定义UICollectionViewLayout
,因为我需要它来水平和垂直滚动。
我的布局与this SO answer完美配合,所以我有一个可以四处移动的网格。简短版本是每行单元格都是视图的section
,并且所有单元格都基于统一cellSize
(开头)50。
然后我使用this SO answer的修改版本计算了捏缩变能力,我在收到捏手势时基本上改变了布局的cellSize
值,然后使布局无效,以便使用稍大或稍小的布局重新绘制。因此,所有单元格变大或变小,我们进行缩放。
这里是捏手势方法的代码:
-(void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture {
double newCellSize = [(IMMapViewLayout *)_mainCollectionView.collectionViewLayout cellSize] * gesture.scale;
newCellSize = MIN(newCellSize, 100);
newCellSize = MAX(newCellSize, 15);
[(IMMapViewLayout *)_mainCollectionView.collectionViewLayout setCellSize:newCellSize];
[_mainCollectionView.collectionViewLayout invalidateLayout];
}
一切正常(几乎)完美。
我的问题是:它从左上角缩放,而不是从缩放位置缩放。我想,这是有道理的,因为我们正在重新绘制所有内容,而且它有点大,但它显然不是理想的效果。
我的第一个念头就是直接在夹点下检测细胞,然后使用scrollToItemAtIndexPath:atScrollPosition:animated:
瞬间移回到那个细胞,但它似乎没有工作,动画变得超级 - 反正波涛汹涌。此外,如果你在屏幕中心以外的任何地方捏,那么在缩放过程中很难将它反复移回到那个精确的位置。
这是我现在所拥有的:
-(void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture {
double newCellSize = [(IMMapViewLayout *)_mainCollectionView.collectionViewLayout cellSize] * gesture.scale;
newCellSize = MIN(newCellSize, 100);
newCellSize = MAX(newCellSize, 15);
[(IMMapViewLayout *)_mainCollectionView.collectionViewLayout setCellSize:newCellSize];
[_mainCollectionView.collectionViewLayout invalidateLayout];
if([gesture numberOfTouches] >= 2) {
CGPoint touch1 = [gesture locationOfTouch:0 inView:_mainCollectionView];
CGPoint touch2 = [gesture locationOfTouch:1 inView:_mainCollectionView];
CGPoint mid;
mid.x = ((touch2.x - touch1.x) / 2) + touch1.x;
mid.y = ((touch2.y - touch1.y) / 2) + touch1.y;
NSIndexPath *currentIndexPath = [_mainCollectionView indexPathForItemAtPoint:mid];
[_mainCollectionView scrollToItemAtIndexPath:currentIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
}
}
任何人都可以帮我完整地进行UICollectionView
缩放,但是以夹点的位置为中心吗?