【问题标题】:How to limit pan gesture area?如何限制平移手势区域?
【发布时间】:2012-08-16 10:11:25
【问题描述】:

我有我的UIImageView,我有另一个UIView 矩形。通过对UIView 矩形应用平移手势,它也会超出UIImageView。我不想被拖出UIImageView

我尝试了下面的代码,但它不是那样工作

-(void)handleMovementView:(UIPanGestureRecognizer *)recognizer
{
    CGPoint movement;

    if(recognizer.state == UIGestureRecognizerStateBegan || recognizer.state == UIGestureRecognizerStateChanged || recognizer.state == UIGestureRecognizerStateEnded)
    {
        CGRect rec = recognizer.view.frame;
        CGRect imgvw = self.imgViewCrop.frame;
        if((rec.origin.x >= imgvw.origin.x && (rec.origin.x + rec.size.width <= imgvw.origin.x + imgvw.size.width)))
        {
            CGPoint translation = [recognizer translationInView:recognizer.view.superview];
            movement = translation;
            recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
            [recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
            [self handleMovementForHandlers:movement];
        }
    }

}

如果我缓慢应用 Pan,它会应用此条件,但当我快速应用时,它会超出 ImageView

【问题讨论】:

    标签: iphone objective-c uiimageview uigesturerecognizer uipangesturerecognizer


    【解决方案1】:

    不要手动计算点是否在视图的范围内,而是使用CGRectContainsPoint(rect, point)。这对我有用,我喜欢它,因为它更短且更具可读性:

    func handlePan(pan: UIPanGestureRecognizer) {
        switch pan.state {
        case .Began:
            if CGRectContainsPoint(self.pannableView.frame, pan.locationInView(self.pannableView)) {
                // Gesture started inside the pannable view. Do your thing.
            }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个

      -(void)handleMovementView:(UIPanGestureRecognizer *)recognizer
      {
      CGPoint movement;
      
      if(recognizer.state == UIGestureRecognizerStateBegan || recognizer.state == UIGestureRecognizerStateChanged || recognizer.state == UIGestureRecognizerStateEnded)
      {
          CGRect rec = recognizer.view.frame;
          CGRect imgvw = self.imgViewCrop.frame;
          if((rec.origin.x >= imgvw.origin.x && (rec.origin.x + rec.size.width <= imgvw.origin.x + imgvw.size.width)))
          {
              CGPoint translation = [recognizer translationInView:recognizer.view.superview];
              movement = translation;
              recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
              rec = recognizer.view.frame;
      
              if( rec.origin.x < imgvw.origin.x )
                  rec.origin.x = imgvw.origin.x;
      
              if( rec.origin.x + rec.size.width > imgvw.origin.x + imgvw.size.width )
                  rec.origin.x = imgvw.origin.x + imgvw.size.width - rec.size.width;
      
              recognizer.view.frame = rec;
      
              [recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
              [self handleMovementForHandlers:movement];
          }
      }
      }
      

      【讨论】:

      • 如果你在移动的时候感觉迟钝,试试min,max函数限制区域。例如: var newCenter = CGPoint(x: x + translation.x, y: y + translation.y) newCenter.x = min(maxXcenter,newCenter.x) newCenter.x = max(minXCenter,newCenter.x) newCenter。 y = min(maxYCenter,newCenter.y) newCenter.y = max(minYCenter,newCenter.y)
      【解决方案3】:

      扩展 @Matt Quiros 的回答,并在 Swift 3 / 4 中:

      func shouldRespondToGesture(_ gesture: UIGestureRecognizer, in frame: CGRect) -> Bool {
          return gesture.state == .began && frame.contains(gesture.location(in: self.view))
      }
      

      【讨论】:

        【解决方案4】:

        先获取识别器(平移手势识别器)的坐标(CGRect),再获取ImageView(Your ImageView)的坐标(CGRect)。

        然后根据你的要求比较这个坐标。

        如果您仍然遇到任何问题,请记录图像视图和识别器的 x 和 y 值。

        【讨论】:

        • 请不要乞求“喜欢”的答案。
        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多