Pregunta

d'me gusta combinar un UILongPressGestureRecognizer con un UIPanGestureRecognizer.

El UIPanGestureRecognizer debe comenzar con una pulsación larga. ¿Hay una manera simple de hacer esto? o es lo que realmente tengo que escribir mi propio reconocedor gesto?

Me wa no algo así como en la pantalla principal. Se pulsa sobre un icono y después de algún tiempo que los iconos empiecen bamboleo. Luego, sin soltar el dedo de la pantalla que puedo empezar a arrastrar el icono debajo de mi dedo alrededor.

¿Fue útil?

Solución 3

I encontró una solución: Este método UIGestureRecognizerDelegate hace exactamente lo que yo buscaba:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Otros consejos

En realidad, usted no tiene que combinar reconocedores gesto - puede hacerlo únicamente con UILongPressGestureRecognizer ... Usted entrará StateBegan una vez que su toque (EN) han permanecido dentro 'allowableMovement' para 'minimumPressDuration'. Se queda en su longPressGesture continua, siempre y cuando no levanta ninguna de sus dedos -. Para que pueda empezar a mover los dedos y seguir el movimiento a través StateChanged

Long-prensa gestos son continuas. El gesto comienza (UIGestureRecognizerStateBegan) cuando el número de dedos permisibles (numberOfTouchesRequired) han sido presionado por el período especificado (minimumPressDuration) y los toques no ir más allá de la gama permisible de movimiento (allowableMovement). Las transiciones gesto reconocedor al estado Change cada vez que un dedo se mueve, y termina (UIGestureRecognizerStateEnded) cuando cualquiera de los dedos están levantadas.

Yo tenía un poco de un tiempo difícil para este problema. La respuesta aceptada no era suficiente. No importa lo que he puesto en ese método los pan manipuladores o LongPress conseguirían invocado. Una solución que encontré fue como sigue:

  1. Asegúrese de que los delegados de los reconocedores gesto están asignados a la misma clase (en mi caso yo) y aseguran la clase delegada es una UIGestureRecognizerDelegate.
  2. Añadir el siguiente método delegado a su clase (según la respuesta anterior):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
  3. Agregue el siguiente método delegado a su clase:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
  4. A continuación, añadir ya sea una propiedad o Ivar, que hará un seguimiento de si el recipiente debe ser permitido para comenzar (ver método anterior). En mi caso BOOL shouldAllowPan.

  5. Set BOOL a NO en su init o viewDidLoad. Dentro de su manejador LongPress establecer la BOOL a YES. Lo hago así:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
  6. Dentro de la Panhandler hago un cheque en la BOOL:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. Y finalmente restablecer el BOOL dentro del Panhandler:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. Y luego ir a tomar una cerveza para felicitarse. ;)

El enfoque de Andy B en Swift,

  1. añadir el UIGestureRecognizerDelegate delegado a la clase

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. Agregar una variable miembro

    var shouldAllowPan: Bool = false
    
  3. Añadir los gestos y necesidad de agregar el delegado gesto sartén al VC. Esto es necesario para desactivar las funciones de fuego shouldRecognizeSimultaneouslyWithGestureRecognizer y gestureRecognizerShouldBegin

    // long press
    let longPressRec = UILongPressGestureRecognizer(target: self, action: "longPress:")
    yourView.addGestureRecognizer(longPressRec)
    
    // drag
    let panRec = UIPanGestureRecognizer(target: self, action: "draggedView:")
    panRec.delegate = self
    yourView.addGestureRecognizer(panRec)
    
  4. Permitir gestos simultáneos

    func gestureRecognizer(UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
        // println("shouldRecognizeSimultaneouslyWithGestureRecognizer");
        return true
    }
    
    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
         // We only allow the (drag) gesture to continue if it is within a long press
         if((gestureRecognizer is UIPanGestureRecognizer) && (shouldAllowPan == false)) {
             return false;
         }
         return true;
    }
    
  5. Dentro de la larga manejador de prensa:

    func longPress(sender: UILongPressGestureRecognizer) {
    
        if(sender.state == .Began) {
            // handle the long press
        }
        else if(sender.state == .Changed){
            shouldAllowPan = true
    
        }
        else if (sender.state == .Ended) {
            shouldAllowPan = false
        }
    } 
    

Leer la sección "Notas de subclases" de UIGestureRecognizer Referencia de las clases de Apple en:

https://developer.apple.com/library / preliminar / TVOS / documentación / UIKit / Referencia / UIGestureRecognizer_Class /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top