簡體   English   中英

手勢識別器捏和鍋在同一張照片上-松開捏的中心

[英]Gesture Recognizer Pinch and Pan at same pic - loosing centre for pinching

我的問題是我不能使用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);
} 

試試這個:

在您的代碼中添加此方法:

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

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM