43 votes

Combiner le geste de pression longue et le geste de déplacement

Je déplace mes vues en

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

Maintenant, je veux faire la même chose en glissant avec une pression longue.

Une idée ?

91voto

Srikar Appal Points 26892

UILongPressGestureRecognizer fait déjà ce que vous voulez pour vous. Jetez un coup d'œil à la UIGestureRecognizerState propriété. De la documentation :

Les gestes de pression longue sont continus. Le geste commence (UIGestureRecognizerStateBegan) lorsque le nombre de doigts autorisés (numberOfTouche) est atteint. (numberOfTouchesRequired) ont été pressés pendant la période spécifiée (minimumPressDuration) et que les touches ne dépassent pas la limite de l'espace libre. l'amplitude de mouvement autorisée (allowableMovement). La reconnaissance passe à l'état Change chaque fois qu'un doigt bouge, et s'arrête (UIGestureRecognizerStateEnded) lorsque l'un des doigts est soulevé. sont levés.

Donc, essentiellement après votre UILongPressGestureRecognizer Le sélecteur est appelé, vous écoutez UIGestureRecognizerStateBegan, UIGestureRecognizerStateChanged, UIGestureRecognizerStateEnded. Continuez à changer le cadre de vos vues pendant 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
    }
}

37voto

rob mayoff Points 124153
@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;
}

5voto

Hari Kunwar Points 1282

En Swift, cela peut être réalisé en utilisant le code suivant

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 {
       ...
    }
}

2voto

Andrew Points 1214

Il n'est pas nécessaire de déclarer _priorPoint ;

Dans mon cas, je veux seulement que la vue se déplace horizontalement, donc je change seulement la coordonnée x.

Voici ma solution :

    if (longpressGestRec.state == UIGestureRecognizerStateChanged)
    {
        UIView *view = longpressGestRec.view;

        // Location of the touch within the view.
        CGPoint point = [longpressGestRec locationInView:view];

        // Calculate new X position based on the amount the gesture
        // has moved plus the size of the view we want to move.
        CGFloat newXLoc = (item.frame.origin.x + point.x) - (item.frame.size.width / 2);
        [item setFrame:CGRectMake(newXLoc,
                                  item.frame.origin.y,
                                  item.frame.size.width,
                                  item.frame.size.height)];
    }

2voto

Lubomir.O Points 21

Merci à Hari Kunwar pour le code Swift, mais la fonction longPressAction n'est pas correctement définie.

Voici une version améliorée :

@objc func longPressAction(gesture: UILongPressGestureRecognizer)  {
    if gesture.state == UIGestureRecognizerState.began {
    }
    else if gesture.state == .changed {
        guard let view = gesture.view else {
            return
        }
        let location = gesture.location(in: self.view)
        view.center = CGPoint(x:view.center.x + (location.x - view.center.x),
                                          y:view.center.y + (location.y - view.center.y))
    }
    else if gesture.state == UIGestureRecognizerState.ended{
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X