Combina gestos largos y gestos de arrastre juntos

Estoy moviendo mis puntos de vista

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

Ahora, quiero hacer lo mismo arrastrando con la presión larga.

¿Alguna idea?

UILongPressGestureRecognizer ya hace lo que desea para usted. Eche un vistazo a la propiedad UIGestureRecognizerState . De la documentation :

Los gestos de pulsación prolongada son continuos. El gesto comienza (UIGestureRecognizerStateBegan) cuando se ha presionado el número de dedos permitidos (numberOfTouchesRequinetworking) durante el período especificado (minimumPressDuration) y los toques no se mueven más allá del range permitido de movimiento (PermissibleMovement). El reconocedor de gestos transita al estado de cambio cada vez que se mueve un dedo, y termina (UIGestureRecognizerStateEnded) cuando se levanta cualquiera de los dedos.

Entonces, esencialmente después de que se UILongPressGestureRecognizer su selector UILongPressGestureRecognizer , usted escucha UIGestureRecognizerStateBegan, UIGestureRecognizerStateChanged, UIGestureRecognizerStateEnded. Siga cambiando su marco de vistas durante 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 } } 
 @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; } 

No necesita declarar _priorPoint;

En mi caso, solo quiero que la vista se mueva horizontalmente, así que solo estoy cambiando la coorderada x.

Aquí está mi solución:

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

En Swift esto se puede lograr utilizando el código siguiente

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