Que no se puede entrar UIScreenEdgePanGestureRecognizer a trabajar cuando me cree cuando lo añado a mi punto de vista controlador usando la Interface Builder, así que me estoy preguntando aquí para establecer si estoy haciendo algo mal o si hay un error en Xcode.

Aquí están los pasos para reproducir:

  • Crear un nuevo proyecto de Xcode uso de la «Vista Única de la Aplicación de la plantilla» para iOS.
  • Agregar un UIView a la vista principal del controlador mediante la función de arrastrar desde la Biblioteca de Objeto en el Interface Builder
  • Agregar un UIScreenEdgePanGestureRecognizer a la vista mediante la función de arrastrar desde la Biblioteca de Objeto en el Interface Builder
  • Asegurarse de que el gesto reconocedor está habilitado y que un borde seleccionado:

¿Cómo puedo configurar una UIScreenEdgePanGestureRecognizer utilizando el Interface Builder?

  • Abrir el editor asistente de la ViewController clase y la tecla ctrl y arrastre desde la UIScreenEdgePanGestureRecognizer a la ViewControlleraplicación de bloque para crear una nueva IBAction
    «Añadir un punto de interrupción en la acción del cuerpo del método para probar si el borde de la cacerola gesto está siendo reconocido

El código resultante es el siguiente:

¿Cómo puedo configurar una UIScreenEdgePanGestureRecognizer utilizando el Interface Builder?

Si ejecuto la aplicación en mi dispositivo (iPhone 6 con iOS 8.02) el punto de interrupción no obtener golpeó cuando hago un gesto de borde.

Hay algo que me falta?

ACTUALIZACIÓN: este fue presentada como un error de Apple (rdar://18582306) en 08-Oct-2014 y todavía no se resuelve en Xcode 6.4 (6E35b)

InformationsquelleAutor j b | 2014-10-08

7 Comentarios

  1. 24

    He creado un proyecto para poner a prueba tu pregunta y encontré el mismo problema que usted hizo. Aquí están los escenarios que para probar:

    • Hice exactamente como lo hizo, mediante el Interface Builder, para construir el borde de la pantalla del gesto. La única diferencia en mi código es que me ponga una línea de código en el selector para que el depurador tendría algo para dejar en el. El depurador no lograron detener exactamente como usted los encontró.

      -(void)handlePan:(id)sender
      {
          NSString *test = @"";
      }
    • Entonces creé un adicional de movimiento utilizando el gesto de pellizcar en el mismo punto de vista utilizando el Interface Builder y yo era capaz de conseguir el depurador para detener dentro de ese selector. Así Interface Builder, parece ser capaz de construir otros gestos correctamente.

    • Entonces creé el borde de la pantalla gesto manualmente con el siguiente código y funcionó como se esperaba.

    En el ViewController.h archivo que incluye el UIGestureRecognizerDelegate.

    @interface ViewController : UIViewController <UIGestureRecognizerDelegate>
    @end

    En el ViewController.m archivo que he implementado el gesto manualmente.

    #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

    Que terminó con la misma conclusión que tú, parece que hay algo mal con el Generador de Interfaz de la aplicación de la UIScreenEdgePanGestureRecognizer.

    • Quería añadir que he probado en el simulador y en mi dispositivo con los mismos resultados – no hay respuesta al gesto implementado por el IB.
    • Gracias por tomar el tiempo para probar esto. Ahora he presentado un informe de error con Apple: openradar.io/18582306
    • He marcado esto como el aceptado respuesta, ya que confirma que no estoy haciendo nada incorrecto, y que Xcode no se comporta como se espera.
    • Muy interesante! ¿Qué versión de Xcode se utilizan?
    • Estoy usando 6.0.1 (6A317)
    • Puedo confirmar que esto es todavía y el problema con la 6.1 (6A1046a)
    • Gracias gastado edades mirando este. Todavía un problema con la Versión 6.1.1 (6A2008a).
    • Sin la necesidad de delegar aquí.. hay?
    • Todavía un bug en la Versión 6.2 (6C131e). No me impresionó.

  2. 8

    He probado en Xcode 7.0 Beta 4 (7A165t) y aún así es un error. Agregar el Borde de la Pantalla Pan Gesto de Reconocimiento a través de la Interface Builder, no llama a los que se hace referencia IBAction, sin embargo, agregar mediante programación como esta funciona bien:

    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!")
            }
        }
    }

    Sugerencia: no te olvides de añadir el UIGestureRecognizerDelegate protocolo para su clase. De lo contrario, obtendrá un error en edgeGestureRecognizer.delegate = self

  3. 6

    Puede ser considerado como un error, pero en realidad, aquí es algo útil:

    «Después de la creación de un borde de la pantalla pan gesto de reconocimiento, asignar un valor adecuado a los bordes de la propiedad antes de colocar el gesto de reconocimiento a su vista.»

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

    Este requisito sólo se aplica a UIScreenEdgePanGestureRecognizer, así que yo creo que por eso Xcode hacen mal, debe de ser implementado como la secuencia normal, alloc->init->attach->el valor fijado. Va a trabajar a todos los demás GestureRecongnizer pero no UIScreenEdgePanGestureRecognizer.

  4. 3

    Xcode no siempre es un buen vecino. Lo siento.

    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)")
    }
  5. 2

    Para asegurarse de que varias gesto reconocedores pueden trabajar juntos los que tienen que implementar el método shouldRecognizeSimultaneouslyWithGestureRecognizer y devolver true:

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

    Lo siento por el código Swift, pero usted debe tener la idea.

    Este método debe aplicarse incluso si usted está usando un solo gesto de reconocimiento debido a que la vista puede tener su propio (sistema) reconocedores, tales como MKMapView.

    • Por desgracia, la aplicación de la gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: método de delegado y hacer el ViewController la UIScreenEdgePanGestureRecognizer‘s delegado no hace ninguna diferencia. Todavía no hay borde de la cacerola detectado. Regular UIPanGestureRecognizer funciona bien. Creo que podría elevar un informe de error.
  6. 2

    Parece que hay un error en Xcode 6.4 del interface builder y Swift. También, Thomas LIU, fue la respuesta de corregir también: parece ser necesario para establecer la .el borde de la propiedad en el código, en lugar de con el Interface Builder.

    Aunque hay edge casillas de verificación en IB, parecen ser ignorados.

    He resuelto de esta manera:
    Ctrl y arrastre desde el gesto de reconocimiento a la viewController clase para crear un IBOutlet:

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

    luego, en viewDidLoad:

    leftEdgeGestureRecognizer.edges = .Left

    y, por último, pulse ctrl y arrastre desde el reconocedor para crear un IBAction

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

Dejar respuesta

Please enter your comment!
Please enter your name here