【问题标题】:Limit UIPanGestureRecognizer movement in circle限制 UIPanGestureRecognizer 圆周运动
【发布时间】:2013-09-02 08:29:49
【问题描述】:

我正在使用UIPanGesturerecogniser 在屏幕上移动UIButton

我正在以这种方式将手势添加到按钮:

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

[ButtonNote addGestureRecognizer:panRecognizer];

方法是

- (void)move:(id)sender {

    [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations];

CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.ViewA];

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {

        firstX = [[sender view] center].x;
        firstY = [[sender view] center].y;

        [self.view addSubview:[(UIPanGestureRecognizer*)sender view]];

        if (self.Button1.frame.size.height > 200) {

        }
        else {

       }
    }

    translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);

    [[sender view] setCenter:translatedPoint];

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded||[(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateCancelled||[(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateFailed){

        CGPoint fingerPoint2 = [(UIPanGestureRecognizer*)sender locationInView:self.BallBin.superview];

        if (CGRectContainsPoint(self.BallBin.frame, fingerPoint2)) {
            if (self.Button3.frame.size.height > 200) {

                UIPanGestureRecognizer *gesture = (UIPanGestureRecognizer *)sender;
                UIButton *button = (UIButton *)gesture.view;
                [[(UIPanGestureRecognizer*)sender view] removeFromSuperview];
                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsDirectoryPath = [paths objectAtIndex:0];
                NSString *myFilePath = [documentsDirectoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", button.titleLabel.text]];
                NSFileManager *fileManager = [NSFileManager defaultManager];
                [fileManager removeItemAtPath:myFilePath error:NULL];

                [self performSelector:@selector(DeleteBusinessCard:) withObject:nil afterDelay:0.5];

            }
            else {
                [self.ViewA addSubview:[(UIPanGestureRecognizer*)sender view]];
        }
    }

        if (self.Button1.frame.size.height > 200) {

        }
        else {

            [self.ViewB addSubview:self.BallBin];
        }

                         }];
        }

        CGFloat finalX = translatedPoint.x + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.ViewA].x);
        CGFloat finalY = translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.ViewA].y);

        if(UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {

            if(finalX < 0) {

                finalX = 0;
            }

            else if(finalX > 768) {

                finalX = 768;
            }

            if(finalY < 0) {

                finalY = 0;
            }

            else if(finalY > 1024) {

                finalY = 1024;
            }
        }

        else {

            if(finalX < 0) {

                finalX = 0;
            }

            else if(finalX > 1024) {

                finalX = 768;
            }

            if(finalY < 0) {

                finalY = 0;
            }

            else if(finalY > 768) {

                finalY = 1024;
            }
       }
    }
 }

我想限制按钮在屏幕上某个圆形区域内的移动,例如半径为 80。现在按钮在整个屏幕上移动。无论如何,ViewA 是一个覆盖整个屏幕的UIView

【问题讨论】:

    标签: ios uipangesturerecognizer


    【解决方案1】:

    使用 Pitagoras 公式计算当前位置与起点之间的距离。在你的情况下:

    if (gesture.state == UIGestureRecognizerStateChanged)
    {
        if (sqrt(deltaX*deltaX + deltaY*deltaY) < 80)
            move view to finger's position
        else
            stay where you are
    }
    

    【讨论】:

      【解决方案2】:

      我们可以有一个逻辑来计算与特定中心的坐标。

      当平移手势发生时,函数应该修改平移对象的中心, 以以下代码为例,名为 pin 的 pannig 对象,它是一个 50x50 pts 的图像, 将设置为绕过 194x194 点的大圆圈图像,位于 63, 141。

      这是 PanGesture 处理程序代码:

      - (void)pinPanPiece:(UIPanGestureRecognizer *)gestureRecognizer {
      CGPoint center = CGPointMake(63.0 + 194.0/2, 141.0+ 194.0/2);
      
      UIView *piece = [gestureRecognizer view];
      
      if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
          [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
          if (piece == pin) {
      
              CGPoint translation = [gestureRecognizer translationInView:[piece superview]];
              float newX = piece.frame.origin.x + translation.x;
              CGRect newFrame = piece.frame;
      
              CGPoint pinCenter = CGPointMake(newFrame.origin.x + newFrame.size.width / 2.0, newFrame.origin.y + newFrame.size.height / 2.0);
              newFrame.origin.x = newX;
      
              CGPoint newPinCenter = CGPointMake(newFrame.origin.x + newFrame.size.width / 2.0, newFrame.origin.y + newFrame.size.height / 2.0);
      
              float detectY = pinCenter.y + translation.y;
              BOOL bUpCenter = detectY < center.y;
      
              float deltaX = center.x - newPinCenter.x;
              float deltaY = sqrtf((97.0 *97.0) - (deltaX * deltaX));
              float newY;
      
              if (bUpCenter) {
                  newY = center.y - deltaY;
              }
              else {
                  newY = center.y + deltaY;
              }
      
              newY -= newFrame.size.height / 2.0;
              newFrame.origin.y = newY;
      
              if ((newPinCenter.x >= 63.0) && (newPinCenter.x <= 63.0+194.0)) {
                 [piece setFrame:newFrame];
              }
          }
      
          [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多