0

My problem is that I can't use Pinch and Pan( both functions work perfectly separate. but if I move pic - zooming have the wrong centre anchor (between 2 fingers) code:

//fullScreenImage is UIImageView that i would like to manipulate

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scalePiece:)];
pinchRecognizer setDelegate:(id)self];
[fullScreenImage.superview addGestureRecognizer:pinchRecognizer];

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
[panRecognizer setMinimumNumberOfTouches:1];
[panRecognizer setMaximumNumberOfTouches:1];
[panRecognizer setDelegate:(id)self];
[self.view addGestureRecognizer:panRecognizer];




- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer
{
  [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]);
        [gestureRecognizer setScale:1];
}

//Setting anchor between 2 fingers to zoom correctly

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
   if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
       UIView *piece = gestureRecognizer.view;
        CGPoint locationInView = CGPointMake([gestureRecognizer locationInView:piece].x,[gestureRecognizer locationInView:piece].y);
        CGPoint locationInSuperview = CGPointMake([gestureRecognizer locationInView:piece.superview].x,[gestureRecognizer locationInView:piece.superview].y);
        piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
        piece.center = locationInSuperview;

    }
}


- (void)move:(UIPinchGestureRecognizer *)recognizer
{
    if ([(UIPanGestureRecognizer*)recognizer state] == UIGestureRecognizerStateBegan) {
        position.y=[recognizer locationInView:recognizer.view].y-fullScreenImage.center.y;
        position.x=[recognizer locationInView:recognizer.view].x-fullScreenImage.center.x;
    }
  fullScreenImage.center=CGPointMake([recognizer locationInView:fullScreenImage.superview].x-position.x, [recognizer locationInView:fullScreenImage.superview].y-position.y);
} 
Larme
  • 24,190
  • 6
  • 51
  • 81
Dmitrii Z
  • 145
  • 1
  • 5

2 Answers2

0

Try this One:

Add this method in your code :

  - (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
  {
    UIView *piece = gestureRecognizer.view;
    CGPoint locationInView = [gestureRecognizer locationInView:piece];
    CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

    piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
    piece.center = locationInSuperview;
  }

  - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  {
     return YES;
  }

And call this method when you are using gesture.

 - (void)scalePiece_image:(UIPinchGestureRecognizer *)gestureRecognizer
 {
     [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

     if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged)
     {
         [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]);
         [gestureRecognizer setScale:1];
     }
 }
Soumya Ranjan
  • 4,817
  • 2
  • 26
  • 51
  • unfortunately, the same result( - code works! but when i move pic using - (void)move:(UIPinchGestureRecognizer *)recogniser it couldn't find correct anchor – Dmitrii Z May 27 '14 at 14:51
0

SR Nayak answer is not correct because the pivot will change when you pinch and the layer will slide.

This code works:

- (IBAction)pinchLayer:(UIPinchGestureRecognizer *)gestureRecognizer {

  static CGPoint lastPoint;
  static CGFloat lastScale;

  if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
    lastScale = 1.0;
    lastPoint = [gestureRecognizer locationInView:self.containerView];
  }

  // Scale
  CGFloat scale = 1.0 - (lastScale - gestureRecognizer.scale);
  [[gestureRecognizer view].layer setAffineTransform:
   CGAffineTransformScale([[gestureRecognizer view].layer affineTransform],
                          scale,
                          scale)];
  lastScale = gestureRecognizer.scale;

  // Translate
  CGPoint point = [gestureRecognizer locationInView:self.containerView];
  [[gestureRecognizer view].layer setAffineTransform:
   CGAffineTransformTranslate([[gestureRecognizer view].layer affineTransform],
                              point.x - lastPoint.x,
                              point.y - lastPoint.y)];
  lastPoint = [gestureRecognizer locationInView:self.containerView];

}
Duck
  • 34,902
  • 47
  • 248
  • 470