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

时间:2014-09-05 22:36:39

标签: ios uicollectionview uigesturerecognizer pinchzoom uipinchgesturerecognizer

我正在使用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缩放,但是以夹点的位置为中心吗?

0 个答案:

没有答案