结合长按手势和拖动手势

PJR*_*PJR 42 iphone objective-c uigesturerecognizer ios

我正在移动我的观点

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveRight:)];
[panRecognizer setMinimumNumberOfTouches:1];
[panRecognizer setMaximumNumberOfTouches:1];
[panRecognizer setDelegate:self];
[bubbleView[rightCnt] addGestureRecognizer:panRecognizer];
[panRecognizer release];
Run Code Online (Sandbox Code Playgroud)

现在,我希望通过长按拖动来做同样的事情.

任何的想法?

Sri*_*aju 85

UILongPressGestureRecognizer已经做了你想要的.看看UIGestureRecognizerState酒店.从文档:

长按手势是连续的.当指定时间段(minimumPressDuration)按下允许的手指数(numberOfTouchesRequired)并且触摸不超出允许的移动范围(allowableMovement)时,手势开始(UIGestureRecognizerStateBegan).每当手指移动时,手势识别器转换到改变状态,并且当任何手指被抬起时,手势识别器结束(UIGestureRecognizerStateEnded).

因此,基本上在UILongPressGestureRecognizer调用选择器之后,您将收听UIGestureRecognizerStateBegan,UIGestureRecognizerStateChanged,UIGestureRecognizerStateEnded.在此过程中不断更改视图框架UIGestureRecognizerStateChanged.

- (void)moveRight:(UILongPressGestureRecognizer *)gesture
{
    if(gesture.state == UIGestureRecognizerStateBegan)
    {
        //if needed do some initial setup or init of views here
    }
    else if(gesture.state == UIGestureRecognizerStateChanged)
    {
        //move your views here.
        [yourView setFrame:];
    }
    else if(gesture.state == UIGestureRecognizerStateEnded)
    {
        //else do cleanup
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用CGPoint translatedPoint = [(UILongPressGestureRecognizer*)发送者translationInView:self.view]; 但是长期按下我必须使用的东西? (3认同)
  • 但是通过这个我怎么能得到翻译点 (3认同)
  • @SrikarAppal你没有完全回答这个问题.PJR想知道每次调用`UIGestureRecognizerStateChanged`时如何获得手指坐标.答案是:使用`[myGestureRecognizer locationInView:aView]` (3认同)
  • 不,我想在长按和拖动时移动我的观点 (2认同)

rob*_*off 36

@implementation MyViewController {
    CGPoint _priorPoint;
}

- (void)moveRight:(UILongPressGestureRecognizer *)sender {
    UIView *view = sender.view;
    CGPoint point = [sender locationInView:view.superview];
    if (sender.state == UIGestureRecognizerStateChanged) {
        CGPoint center = view.center;
        center.x += point.x - _priorPoint.x;
        center.y += point.y - _priorPoint.y;
        view.center = center;
    }
    _priorPoint = point;
}
Run Code Online (Sandbox Code Playgroud)


Har*_*war 5

在 Swift 中,这可以使用以下代码实现

class DragView: UIView { 
  // Starting center position
  var initialCenter: CGPoint?

  override func didMoveToWindow() {
    super.didMoveToWindow()
    // Add longPress gesture recognizer
    let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPressAction(gesture:)))
    addGestureRecognizer(longPress)
  }

  // Handle longPress action
  func longPressAction(gesture: UILongPressGestureRecognizer) {
    if gesture.state == .began {
        guard let view = gesture.view else {
            return
        }
        initialCenter = gesture.location(in: view.superview)
    }
    else if gesture.state == .changed {
        guard let originalCenter = initialCenter else {
            return
        }

        guard let view = gesture.view else {
            return
        }

        let point = gesture.location(in: view.superview)

        // Calculate new center position
        var newCenter = view.center;
        newCenter.x += point.x - originalCenter.x;
        newCenter.y += point.y - originalCenter.y;

        // Update view center
        view.center = newCenter
    }
    else if gesture.state == .ended {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)