Frage Wie richte ich einen UIScreenEdgePanGestureRecognizer mithilfe von Interface Builder ein?


Ich kann nicht bekommen UIScreenEdgePanGestureRecognizer Ich arbeite, wenn ich es erstelle, wenn ich es über den Interface Builder meinem View-Controller hinzufüge, also frage ich hier, ob ich etwas falsch mache oder ob es einen Fehler in Xcode gibt.

Hier sind die Schritte zum Reproduzieren:

  • Erstellen Sie ein neues Xcode-Projekt mit der Vorlage "Single View Application" für iOS.
  • Füge hinzu ein UIView zum Hauptansicht-Controller, indem Sie einen aus der Objektbibliothek in Interface Builder ziehen
  • Füge hinzu ein UIScreenEdgePanGestureRecognizer zu der Ansicht, indem Sie einen aus der Objektbibliothek in Interface Builder ziehen
  • Stellen Sie sicher, dass die Gestenerkennung aktiviert ist und dass eine Kante ausgewählt ist:

enter image description here

  • Öffnen Sie den Assistenten Editor für die ViewController Klasse und Strg-Ziehen von der UIScreenEdgePanGestureRecognizer zum ViewControllerUmsetzungsblock zum Erstellen eines neuen IBAction `Fügen Sie einen Haltepunkt im Methodenhauptteil der Aktion hinzu, um zu testen, ob die Kantenschwenkgeste erkannt wird

Der resultierende Code lautet wie folgt:

Code example

Wenn ich die Anwendung auf meinem Gerät (iPhone 6 mit iOS 8.02) ausführe, wird der Haltepunkt nicht berührt, wenn ich mit der Kante wische.

Gibt es etwas, das mir fehlt?

UPDATE: Dies wurde am 08. Oktober 2014 als Fehler bei Apple (rdar: // 18582306) abgelegt und wird immer noch nicht in Xcode 6.4 gelöst (6E35b)


17
2017-10-08 12:32


Ursprung


Antworten:


Ich habe ein Projekt eingerichtet, um Ihre Frage zu testen, und habe dasselbe Problem gefunden wie Sie. Hier sind die Szenarien, die ich zum Testen eingerichtet habe:

  • Ich habe genau wie Sie mit dem Interface Builder gearbeitet, um die Bildschirmkanten-Geste zu erstellen. Der einzige Unterschied in meinem Code ist, dass ich eine Codezeile in den Selektor lege, damit der Debugger etwas zum Anhalten hat. Der Debugger konnte nicht genau so anhalten, wie Sie gefunden haben.

    -(void)handlePan:(id)sender
    {
        NSString *test = @"";
    }
    
  • Ich erstellte dann eine zusätzliche Geste mit der Pinch-Geste in derselben Ansicht mit dem Interface Builder und konnte den Debugger innerhalb dieses Selektors stoppen. Der Interface Builder scheint also in der Lage zu sein, andere Gesten korrekt zu erstellen.

  • Ich erstellte dann die Bildschirmkantengeste manuell mit dem folgenden Code und es funktionierte wie erwartet.

In der ViewController.h-Datei habe ich das UIGestureRecognizerDelegate eingefügt.

@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
@end

In der ViewController.m Datei habe ich die Geste manuell implementiert.

#import "ViewController.h"

@interface ViewController ()

-(void)handlePan:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad 
{
    [super viewDidLoad];
    UIScreenEdgePanGestureRecognizer *pan = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self
                                                                                              action:@selector(handlePan:)];
    [pan setEdges:UIRectEdgeLeft];
    [pan setDelegate:self];
    [self.view addGestureRecognizer:pan];
}

-(void)handlePan:(id)sender
{
    NSString *test = @"";
}

@end

Ich kam zu der gleichen Schlussfolgerung, die Sie gemacht haben - mit der Implementierung des UIScreenEdgePanGestureRecognizer durch den Interface Builder scheint etwas nicht in Ordnung zu sein.


23
2017-10-08 15:31



Es kann als ein Fehler betrachtet werden, aber eigentlich ist hier etwas Nützliches:

"Weisen Sie nach dem Erstellen eines Pan-Gestenerkennungsprogramms für den Bildschirmrand der Kanteneigenschaft einen geeigneten Wert zu, bevor Sie den Gestenerkenner an Ihre Ansicht anfügen."

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIScreenEdgePanGestureRecognizer_class/index.html

Diese Anforderung gilt nur für UIScreenEdgePanGestureRecognizer, daher denke ich, dass Xcode es falsch macht, es muss als normale Sequenz implementiert werden, alloc-> init-> attach-> set value. Es funktioniert mit allen anderen GestureRecongnizer, aber nicht mit UIScreenEdgePanGestureRecognizer.


6
2018-04-07 07:06



Ich habe es in Xcode 7.0 Beta 4 (7A165t) versucht und es ist immer noch ein Fehler. Wenn Sie den Screen Edge Pan Gesture Recognizer über den Interface Builder hinzufügen, wird die referenzierte IBAction nicht aufgerufen, es kann jedoch wie folgt programmgesteuert hinzugefügt werden:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let edgeGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: "userSwipedFromEdge:")
        edgeGestureRecognizer.edges = UIRectEdge.Left
        edgeGestureRecognizer.delegate = self
        self.view.addGestureRecognizer(edgeGestureRecognizer)
    }

    func userSwipedFromEdge(sender: UIScreenEdgePanGestureRecognizer) {
        if sender.edges == UIRectEdge.Left {
            print("It works!")
        }
    }
}

Hinweis: Vergiss nicht, das hinzuzufügen UIGestureRecognizerDelegate Protokoll zu Ihrer Klasse. Andernfalls erhalten Sie einen Fehler bei edgeGestureRecognizer.delegate = self


6
2017-08-12 11:19



Um sicherzustellen, dass mehrere Gestenerkenner zusammenarbeiten können, müssen Sie die Methode implementieren shouldRecognizeSimultaneouslyWithGestureRecognizer und zurück wahr:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

Entschuldigung für den Swift-Code, aber Sie sollten auf die Idee kommen.

Diese Methode muss auch dann implementiert werden, wenn Sie einen einzelnen Gestenerkenner verwenden, da die Ansicht eigene (System-) Erkennungen wie z MKMapView.


2
2017-10-08 13:10



Xcode ist nicht immer ein guter Nachbar. Es tut uns leid.

override func viewDidLoad() {
    super.viewDidLoad()

    let panGesture = UIScreenEdgePanGestureRecognizer(target: self, action: "panAction:")
    panGesture.edges = .Left
    view.addGestureRecognizer(panGesture)
}


func panAction(sender: UIScreenEdgePanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)

    println("Trans:\(translation)")
}

2
2018-02-19 06:27



Es scheint, dass es einen Fehler in Xcode 6.4 Interface Builder und Swift gibt. Auch die Antwort von Thomas LIU war korrekt: Es scheint notwendig zu sein, die Eigenschaft .edge im Code und nicht im Interface Builder zu setzen.

Obwohl in IB Kanten-Checkboxen vorhanden sind, scheinen sie ignoriert zu werden.

Ich habe es so gelöst: Ziehen Sie bei gedrückter Strg-Taste vom Gestenerkenner zur viewController-Klasse, um ein IBOutlet zu erstellen:

class ViewController: UIViewController {
    @IBOutlet var leftEdgeGestureRecognizer: UIScreenEdgePanGestureRecognizer!

dann in viewDidLoad:

leftEdgeGestureRecognizer.edges = .Left

und schließlich, ziehen Sie ctrl vom Erkenner, um eine IBAction zu erstellen

@IBAction func swipeFromLeft(sender: AnyObject) {
        print("===> Swipe from left edge.\n")
}

2
2017-09-08 06:22



Gleiches Problem von langer Seite. Es ist ein xcode Bug, es ist besser, es programmatisch hinzuzufügen.


1
2018-02-19 07:09