Распознаватель жестов Pinch и Pan на одном изображении - теряется центр для захвата

Моя проблема в том, что я не могу использовать Pinch и Pan (обе функции работают совершенно отдельно, но если я перемещаю изображение - масштабирование имеет неправильный код центральной привязки (между двумя пальцами):

//fullScreenImage — это UIImageView, которым я хотел бы манипулировать

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];
}

//Установка привязки между двумя пальцами для правильного масштабирования

- (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);
} 

person Dmitrii Z    schedule 26.05.2014    source источник


Ответы (2)


Попробуй это:

Добавьте этот метод в свой код:

  - (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;
  }

И вызывайте этот метод, когда вы используете жест.

 - (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];
     }
 }
person Soumya Ranjan    schedule 26.05.2014
comment
к сожалению, тот же результат ( - код работает! но когда я перемещаю изображение с помощью - (void)move:(UIPinchGestureRecognizer *)распознаватель, он не может найти правильный якорь - person Dmitrii Z; 27.05.2014

Ответ SR Nayak неверен, потому что точка поворота будет меняться, когда вы зажимаете, и слой будет скользить.

Этот код работает:

- (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];

}
person Duck    schedule 23.06.2016