使用自定义布局缩放 UICollectionView,但以捏合为中心

Ner*_*ken 6 uigesturerecognizer ios pinchzoom uipinchgesturerecognizer uicollectionview

我正在使用 制作一个大网格UICollectionView,我希望它可以UICollectionView使用标准的捏缩放手势进行缩放(整个,而不仅仅是单个单元格)。有问题的网格有一个 custom UICollectionViewLayout,因为我需要它来水平和垂直滚动。

我的布局与这个 SO answer完美配合,所以我有一个可以四处移动的网格。简短的版本是每行单元格是section视图的一个,并且所有单元格都基于cellSize(开始时)50的统一定位。

然后我使用这个 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];
}
Run Code Online (Sandbox Code Playgroud)

一切都(几乎)完美地工作。

我的问题是:它从左上角放大,而不是从夹点所在的位置放大。我想是有道理的,因为我们正在重新绘制所有内容,而且都变大了一点,但这显然不是预期的效果。

我的第一个想法是简单地检测正下方的单元格,然后使用它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];
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我进行UICollectionView整个缩放,但以捏合的位置为中心吗?