2

I have created one application in which there is one view containing an image view. Below code for zooming an image using UIPinchGestureRecognizer is working. Here innerview is the name of my view.

 - (void)viewDidLoad
    {
[super viewDidLoad];

//Zoom Photo
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
[innerview addGestureRecognizer:pinchGesture];
[pinchGesture release];
mCurrentScale = 0;
mLastScale = 0;
}

-(void)handlePinch:(UIPinchGestureRecognizer*)sender {

NSLog(@"latscale = %f",mLastScale);

mCurrentScale += [sender scale] - mLastScale;
mLastScale = [sender scale];

if (sender.state == UIGestureRecognizerStateEnded)
{
    mLastScale = 1.0;
}

CGAffineTransform currentTransform = CGAffineTransformIdentity;
CGAffineTransform newTransform = CGAffineTransformScale(currentTransform,mCurrentScale, mCurrentScale);
innerview.transform = newTransform;

 } 

But how to use ScrollView in this to view image properly??

komal mehta
  • 269
  • 5
  • 14

2 Answers2

2

Embed your innerView in Scroll View Once you are done with pinching, you can get size of new image and then set its content size

-(void)scale:(id)sender {
  if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
    lastScale = 1.0;
    CGSize zoomViewSize = CGSizeApplyAffineTransform(imgScrollView.frame.size, [(UIPinchGestureRecognizer *)sender view].transform);
    CGPoint centerPoint = CGPointApplyAffineTransform(imgScrollView.frame.origin, [(UIPinchGestureRecognizer *)sender view].transform);

    CGRect r = imgScrollView.bounds;
    CGSize scrollViewSize = imgScrollView.frame.size;
    imgScrollView.contentSize = zoomViewSize;
    imgScrollView.contentOffset = centerPoint; 
  }

  CGFloat currentScale = [[[(UIPinchGestureRecognizer*)sender view].layer valueForKeyPath:@"transform.scale"] floatValue];

  CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);
  scale = MIN(scale, imgScrollView.maximumZoomScale / currentScale);   
  scale = MAX(scale, imgScrollView.minimumZoomScale / currentScale);
  CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
  CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
  [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];
  lastScale = [(UIPinchGestureRecognizer*)sender scale];    
}

Hope this help you :)

Kjuly
  • 34,476
  • 22
  • 104
  • 118
DivineDesert
  • 6,924
  • 1
  • 29
  • 61
  • Can you clarify what is the issue now? So that we can help you? – DivineDesert Mar 31 '12 at 10:05
  • I want both zooming and panning. – komal mehta Mar 31 '12 at 10:16
  • That was not mentioned in your post, right? Now tell you have multiple images inside scrollview or only one and how you manage panning?? – DivineDesert Mar 31 '12 at 10:26
  • I have only one image in imageview which is inside the view. I want that when i pinch on image scroll should appear to view various parts of the image. – komal mehta Mar 31 '12 at 10:58
  • I will suggest you to use CGPoint translate = [(UIPanGestureRecognizer*)sender translationInView:glView]; UIGestureRecognizerState state = [sender state]; //and based on state if (state == UIGestureRecognizerStateBegan) { //do whatever you want } – Praveen-K Mar 31 '12 at 13:55
1

try this

 -(void)scale:(id)sender {


    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
        _lastScale = 1.0;
    }

    CGFloat scale = 1.0 - (_lastScale - [(UIPinchGestureRecognizer*)sender scale]);
    CGAffineTransform currentTransform = self.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

    [self setTransform:newTransform];


}
Hardik rami
  • 359
  • 4
  • 15