Frage

I d'wie ein UILongPressGestureRecognizer mit einem UIPanGestureRecognizer zu kombinieren.

Die UIPanGestureRecognizer sollten mit einem langen Druck beginnen. Gibt es eine einfache Möglichkeit, dies zu tun? oder muß ich wirklich meinen eigenen Gestenerkenner schreiben?

wan't ich so etwas wie auf dem Home-Bildschirm. Sie drücken auf ein Symbol, und nach einiger Zeit die Symbole Wackeln starten. Danach ohne meine Finger vom Bildschirm kann ich starten Sie das Symbol unter dem Finger ziehen um.

War es hilfreich?

Lösung 3

ich eine Lösung gefunden: Diese UIGestureRecognizerDelegate Methode macht genau das, was ich suchte:

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

Andere Tipps

tatsächlich, Sie müssen nicht Geste Erkenner kombinieren - Sie dies mit UILongPressGestureRecognizer allein tun können ... Sie geben StateBegan einmal Ihre Note (n) haben in ‚allowableMovement‘ für ‚minimumPressDuration‘ geblieben. Sie bleiben in der kontinuierlichen longPressGesture solange du nicht von den Fingern heben -. So können Sie beginnen, Ihre Finger und verfolgen die Bewegung durch Statechanged bewegen

Lang drücken Gesten sind kontinuierlich. Die Geste beginnt (UIGestureRecognizerStateBegan), wenn die Anzahl der zulässigen Finger (numberOfTouchesRequired) hat für den angegebenen Zeitraum (minimumPressDuration) und die Berührungen nicht bewegen über den zulässigen Bewegungsbereich (allowableMovement) gedrückt. Die Gestenerkennungsvorrichtung geht in den Zustand ändern, wenn ein Finger bewegt, und es endet (UIGestureRecognizerStateEnded), wenn einer der Finger angehoben werden.

hatte ich ein bisschen eine harte Zeit für dieses Problem. Die akzeptierte Antwort war nicht genug. Egal, was ich die Pfanne oder Longpress in dieser Methode setzen Handler aufgerufen erhalten würden. Eine Lösung, die ich fand, war wie folgt:

  1. Stellen Sie sicher, die Delegierten Geste Erkenner sind auf der gleichen Klasse zugeordnet (in meinem Fall Selbst-) und sicherstellen, dass die Delegierten-Klasse ist ein UIGestureRecognizerDelegate.
  2. Fügen Sie den folgenden Delegatmethode Ihrer Klasse (gemäß der Antwort oben):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
  3. Fügen Sie den folgenden Delegatmethode Ihrer Klasse:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
  4. Dann fügen Sie entweder eine Eigenschaft oder Ivar, die, wenn die Pfanne sollte erlaubt werden, verfolgen wird (siehe oben beschriebene Methode) zu beginnen. In meinem Fall BOOL shouldAllowPan.

  5. Stellen Sie den BOOL zu NO in Ihrem init oder viewDidLoad. In Ihrem Longpress-Handler setzen die BOOL zu YES. Ich mache es wie folgt aus:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
  6. Im Inneren des Panhandler ich eine Überprüfung der BOOL:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. Und zurückgesetzt schließlich die BOOL im Panhandler:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. Und dann ein Bier gehen Schnappen Sie sich gratulieren. ;)

Andy B Ansatz in Swift,

  1. Fügen Sie das UIGestureRecognizerDelegate Delegierter der Klasse

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. Fügen Sie eine Membervariable

    var shouldAllowPan: Bool = false
    
  3. Fügen Sie die Gesten und Notwendigkeit, die pan Geste Delegierter der VC hinzuzufügen. Dies ist notwendig, um Feuer aus den shouldRecognizeSimultaneouslyWithGestureRecognizer und gestureRecognizerShouldBegin Funktionen

    // 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. Lassen Sie die gleichzeitige Gesten

    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. Im Inneren des langen Druck-Handler:

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

Lesen Sie den "Subclassing Notes" Abschnitt UIGestureRecognizer Klassenreferenz von Apple unter:

https://developer.apple.com/library / prerelease / tvos / Dokumentation / UIKit / Reference / UIGestureRecognizer_Class /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top