UIPinchGestureRecognizer.缩放手指的位置,而不仅仅是中心

san*_*ldo 9 uigesturerecognizer ios uipinchgesturerecognizer

我可以用来UIPinchGestureRecognizer在a的视图中进行缩放UICollectionViewCell,但是你开始UIPinch做手势的地方并不重要,总是缩放在视图的中心.例如,我想在视图的左上角区域进行捏合,并且必须在我触摸屏幕的位置创建缩放.但是,如果我这样做,则会在视图的中心创建缩放.

这是我用来进行缩放的代码:

 if([gesture state] == UIGestureRecognizerStateBegan) {
        previousScale = 1.0;

    }

    if (
        [gesture state] == UIGestureRecognizerStateChanged) {

        CGFloat currentScale = [[[gesture view].layer valueForKeyPath:@"transform.scale"] floatValue];

        // Constants to adjust the max/min values of zoom
        const CGFloat kMaxScale = 4.0;
        const CGFloat kMinScale = 1.0;

        CGFloat newScale = 1 -  (previousScale - [gesture scale]); // new scale is in the range (0-1)
        newScale = MIN(newScale, kMaxScale / currentScale);
        newScale = MAX(newScale, kMinScale / currentScale);
        scale = newScale;

        CGAffineTransform transform = CGAffineTransformScale([[gesture view] transform], newScale, newScale);

        [gesture view].transform = transform;

        [self.collectionView.collectionViewLayout invalidateLayout];
    }
Run Code Online (Sandbox Code Playgroud)

那么如何选择UIPinchGesture的位置呢?

谢谢

san*_*ldo 4

我做到了,这是我的最终代码:

if([gesture state] == UIGestureRecognizerStateBegan) {
    previousScale = 1.0;
    lastPoint = [gesture locationInView:[gesture view]];
}

if (
    [gesture state] == UIGestureRecognizerStateChanged) {

    CGFloat currentScale = [[[gesture view].layer valueForKeyPath:@"transform.scale"] floatValue];

    // Constants to adjust the max/min values of zoom
    const CGFloat kMaxScale = 4.0;
    const CGFloat kMinScale = 1.0;

    CGFloat newScale = 1 -  (previousScale - [gesture scale]); // new scale is in the range (0-1)
    newScale = MIN(newScale, kMaxScale / currentScale);
    newScale = MAX(newScale, kMinScale / currentScale);
    scale = newScale;

    CGAffineTransform transform = CGAffineTransformScale([[gesture view] transform], newScale, newScale);

    [gesture view].transform = transform;

    CGPoint point = [gesture locationInView:[gesture view]];
    CGAffineTransform transformTranslate = CGAffineTransformTranslate([[gesture view] transform], point.x-lastPoint.x, point.y-lastPoint.y);

    [gesture view].transform = transformTranslate;
}
Run Code Online (Sandbox Code Playgroud)