Domanda

Mi piacerebbe combinare un UILongPressGestureRecognizer con un UIPanGestureRecognizer.

L'UIPanGestureRecognizer dovrebbe iniziare con una pressione prolungata.C'è un modo semplice per fare questo?o devo davvero scrivere il mio riconoscimento dei gesti?

Non voglio qualcosa di simile sulla schermata iniziale.Premi su un'icona e dopo un po' le icone iniziano a oscillare.Successivamente, senza staccare il dito dallo schermo, posso iniziare a trascinare l'icona sotto il dito.

È stato utile?

Soluzione 3

Ho trovato una soluzione: Questo metodo UIGestureRecognizerDelegate fa esattamente quello che ho cercato:

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

Altri suggerimenti

in realtà, non è necessario combinare i riconoscitori di gesti: puoi farlo esclusivamente con UILongPressGestureRecognizer...Entri in StateBegan una volta che i tuoi tocchi sono rimasti all'interno di "allowableMovement" per "minimumPressDuration".Rimani nel tuo longPressGesture continuo finché non sollevi nessuna delle dita, così puoi iniziare a muovere le dita e tracciare il movimento tramite StateChanged.

I gesti di pressione prolungata sono continui.Il gesto inizia (UIGestureRecognizerStateBegan) quando il numero di dita consentite (numberOfTouchesRequired) è stato premuto per il periodo specificato (minimumPressDuration) e i tocchi non si spostano oltre l'intervallo di movimento consentito (allowableMovement).Il riconoscimento dei gesti passa allo stato Change ogni volta che un dito si muove e termina (UIGestureRecognizerStateEnded) quando una delle dita viene sollevata.

Ho avuto un po 'di un momento difficile per questo problema. La risposta accettata non era abbastanza. Non importa quello che ho messo in questo modo i gestori pan o longpress otterrebbe invocato. Una soluzione che ho trovato è stato il seguente:

  1. Assicurarsi che i delegati dei sistemi di riconoscimento dei gesti vengono assegnati alla stessa classe (nel mio caso sé) e garantiscono la classe delegato è un UIGestureRecognizerDelegate.
  2. Aggiungere il seguente metodo delegato alla classe (come per la risposta di cui sopra):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
  3. Aggiungere il seguente metodo delegato alla classe:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
  4. Quindi aggiungere sia una proprietà o Ivar che traccia se la pentola deve essere permesso di iniziare (vedi metodo di cui sopra). Nel mio caso BOOL shouldAllowPan.

  5. Impostare il BOOL per NO nel vostro init o viewDidLoad. All'interno del vostro gestore longpress impostare il BOOL a YES. Lo faccio in questo modo:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
  6. All'interno della mendicante che faccio un controllo sulla BOOL:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. E infine resettare il BOOL all'interno del mendicante:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. E poi andare afferrare una birra per congratularmi con te. ;)

L'approccio di Andy B a Swift,

  1. Aggiungere il UIGestureRecognizerDelegate delegato alla classe

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. Aggiungere una variabile membro

    var shouldAllowPan: Bool = false
    
  3. Aggiungi i gesti e le necessità di aggiungere il delegato gesto pan al VC. Ciò è necessario per il fuoco al largo delle funzioni shouldRecognizeSimultaneouslyWithGestureRecognizer e 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. Consenti gesti simultanei

    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. All'interno della pressa gestore lungo:

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

Leggere la sezione "Note per derivare sotto classi" di UIGestureRecognizer di riferimento alla classe di Apple all'indirizzo:

https://developer.apple.com/library / prerelease / TVOS / documentazione / UIKit / Reference / UIGestureRecognizer_Class /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top