0

I am using Pinch gesture to zoom out an imageVIew Now can I set the limit that Down to that limit it won't let user to zoom out. I am using below code for that.

func handlePinch(recognizer : UIPinchGestureRecognizer)
    {
        imageView.transform = CGAffineTransformScale(imageView.transform,
                                                         recognizer.scale, recognizer.scale)

        recognizer.scale = 1.0
}
JAck
  • 854
  • 9
  • 18

3 Answers3

4

I have done this using some static variables

var cumulativeScale:CGFloat = 1.0
var maxScale:CGFloat = 3.5
var minScale:CGFloat = 0.5

@IBAction func zoomingInAndOut(_ pinchGesture: UIPinchGestureRecognizer) {
        guard pinchGesture.view != nil else {return}

        if pinchGesture.state == .began || pinchGesture.state == .changed{
            if (cumulativeScale < maxScale && pinchGesture.scale > 1.0) {
                pinchGesture.view?.transform = (pinchGesture.view?.transform)!.scaledBy(x: pinchGesture.scale, y: pinchGesture.scale)
                cumulativeScale *= pinchGesture.scale
                pinchGesture.scale = 1.0
            }
            if (cumulativeScale > minScale && pinchGesture.scale < 1.0) {
                pinchGesture.view?.transform = (pinchGesture.view?.transform)!.scaledBy(x: pinchGesture.scale, y: pinchGesture.scale)
                cumulativeScale *= pinchGesture.scale
                pinchGesture.scale = 1.0
            }
        }
    }
Abhishek
  • 1,261
  • 1
  • 13
  • 30
0
(void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer {

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = [gestureRecognizer scale];
    }

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

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

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

        CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]); 
        newScale = MIN(newScale, kMaxScale / currentScale);   
        newScale = MAX(newScale, kMinScale / currentScale);
        CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
        [gestureRecognizer view].transform = transform;

        lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call  
    }
}
JAck
  • 854
  • 9
  • 18
-2

There is no direct way to limit the scale of UIPinchGestureRecogniser. But you can try the technique described here:

Max/Min Scale of Pinch Zoom in UIPinchGestureRecognizer - iPhone iOS

Community
  • 1
  • 1