pulsa en gesto de reconocimiento – que objeto fue aprovechado?

Soy nuevo en el gesto reconocedores así que tal vez esta pregunta suena tonta: yo soy la asignación de toque gesto reconocedores a un montón de UIViews. En el método es posible averiguar cuál de ellos fue aprovechado de alguna manera o tengo que encontrar a cabo utilizando el punto de que fue aprovechado por la pantalla?

for (NSUInteger i=0; i<42; i++) {
        float xMultiplier=(i)%6;
        float yMultiplier= (i)/6;
        float xPos=xMultiplier*imageWidth;
        float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
        UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
        [greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];

        greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
        greyRect.layer.borderWidth=1.0f;
        greyRect.userInteractionEnabled=YES;
        [greyGridArray addObject:greyRect];
        [self.view addSubview:greyRect];
        NSLog(@"greyGrid: %i: %@", i, greyRect);

        //make them touchable
        UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
        letterTapRecognizer.numberOfTapsRequired = 1;
        [greyRect addGestureRecognizer:letterTapRecognizer];
    }
InformationsquelleAutor suMi | 2014-02-05

11 Kommentare

  1. 111

    Definir su destino selector(highlightLetter:) con el argumento

    UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

    A continuación, usted puede obtener la vista por

    - (void)highlightLetter:(UITapGestureRecognizer*)sender {
         UIView *view = sender.view; 
         NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 
    }
    • gracias! por alguna razón me gustaría poner NSNotification en lugar de UITapGestureRecognizer en el highlightLetter función
  2. 15

    Ha sido un año haciendo esta pregunta pero aún para alguien.

    Al declarar la UITapGestureRecognizer en un particular punto de vista asignar la etiqueta como

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
    [yourGestureEnableView addGestureRecognizer:tapRecognizer];
    yourGestureEnableView.tag=2;

    y en su controlador de hacer como esta

    -(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
        if(sender.view.tag == 2) {
            //do something here
        }
    }
  3. 8

    Aquí es una actualización para Swift 3 y una adición de Mani respuesta. Me gustaría sugerir el uso de sender.view en combinación con el etiquetado UIViews (u otros elementos, dependiendo de lo que usted está tratando de pista) un poco más «avanzados» enfoque.

    1. La adición de la UITapGestureRecognizer, por ejemplo, un UIButton (puede agregar esto a UIViews etc. como bien) O un montón de elementos en una matriz con un lazo y una segunda matriz para el toque gestos.
        let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction)) 
        yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
    1. La definición de la función en el mismo testController (que es el nombre de la Vista Controlador). Vamos a usar etiquetas aquí – las etiquetas son de tipo Int Id, lo que puede añadir a su UIView con yourButton.tag = 1. Si usted tiene una lista dinámica de los elementos como una matriz se puede hacer un bucle que itera a través de su matriz y agrega una etiqueta, lo que aumenta de forma incremental

      func yourFunction(_ sender: AnyObject) {
          let yourTag = sender.view!.tag //this is the tag of your gesture's object
          //do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
          for button in buttonsArray {
            if(button.tag == yourTag) {
              //do something with your button
            }
          }
      }

    La razón de todo esto es porque usted no puede pasar más argumentos para yourFunction cuando se utiliza en conjunción con #selector.

    Si usted tiene aún más compleja estructura de interfaz de usuario y desea obtener del padre de la etiqueta del elemento conectado a la llave de su gesto puede utilizar let yourAdvancedTag = sender.view!.superview?.tag por ejemplo, conseguir el UIView la etiqueta de un botón pulsado en el interior que UIView; puede ser útil para la miniatura+botón de listas, etc.

    • Me gusta tu enfoque del remitente superview. Se puede proporcionar un buen nivel de fail-safe cuando se combina con etiquetas
    • gracias! funciona bastante bien en mi aplicación caso de uso
  4. 4

    Utilizar este código Swift

    func tappGeastureAction(sender: AnyObject) {
        if let tap = sender as? UITapGestureRecognizer {
            let point = tap.locationInView(locatedView)
            if filterView.pointInside(point, withEvent: nil) == true {
                //write your stuff here                
            }
        }
    }
    • Puedo hacer lo que locatedView es y filterView son?
  5. 3

    en swift es bastante simple

    Escribir este código en ViewDidLoad() función

    let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
        tap.numberOfTapsRequired = 2
        tapView.addGestureRecognizer(tap)

    El Controlador de Parte esto podría ser en viewDidLoad o fuera de la viewDidLoad, bateador es puesto en la extensión de

    @objc func tapHandler(gesture: UITapGestureRecognizer) {
        currentGestureStates.text = "Double Tap"
    } 

    aquí solo estoy probando el código de impresión de la salida
    si desea realizar una acción que puede hacer lo que quiera
    o más práctica y leer

  6. 2

    puede utilizar

     - (void)highlightLetter:(UITapGestureRecognizer*)sender {
         UIView *view = sender.view; 
         NSLog(@"%d", view.tag); 
    }

    de vista será el Objeto en el que la toca gesto fue reconocido

  7. 2

    También puede utilizar «shouldReceiveTouch» método de UIGestureRecognizer

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:     (UITouch *)touch {
         UIView *view = touch.view; 
         NSLog(@"%d", view.tag); 
    }    

    No se olvide de establecer delegado de su gesto de reconocimiento.

  8. 1

    Debe enmendar la creación del gesto reconocedor de aceptar parámetro (agregar dos puntos ‘:’)

    UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

    Y en su método de highlightLetter: puede acceder a la vista adjuntado reconocedor:

    -(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
    {
        UIView *view = [recognizer view];
    }
  9. 1

    Típico 2019 ejemplo

    Dicen que usted tiene un FaceView que es algún tipo de imagen. Vas a tener muchos de ellos en la pantalla (o, en una recopilación de vista, una tabla, vista apilada o en otra lista).

    En la clase FaceView usted necesitará una variable «índice»

    class FaceView: UIView {
       var index: Int

    de modo que cada FaceView puede ser auto-consciente de que » la cara es en la pantalla.

    Por lo que debe agregar var index: Int a la clase en cuestión.

    Así que usted está agregando muchos FaceView a la pantalla …

    let f = FaceView()
    f.index = 73
    .. you add f to your stack view, screen, or whatever.

    Ahora agregar un clic a f

    p.addGestureRecognizer(UITapGestureRecognizer(target: self,
                               action: #selector(tapOneOfTheFaces)))

    Aquí está el secreto:

    @objc func tapOneOfTheFaces(_ sender: UITapGestureRecognizer) {
        if let tapped = sender.view as? CirclePerson {
            print("we got it: \(tapped.index)")

    Usted ahora sabe «que» de la cara se hizo clic en su mesa, la pantalla, la pila de vista o lo que sea.

    Es así de fácil.

  10. 0

    Si la adición de diferentes UIGestureRecognizer en diferentes UIViews y quiere distinguir en el método de acción, entonces usted puede comprobar a la vista de la propiedad en el parámetro sender, el cual le dará el remitente vista.

  11. 0
    func tabGesture_Call
    {
         let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
         tapRec.delegate = self
         self.view.addGestureRecognizer(tapRec)
         //where we want to gesture like: view, label etc
    }
    
    func handleTap(sender: UITapGestureRecognizer) 
    {
         NSLog("Touch..");
         //handling code
    }
    • Podría explicar cómo su respuesta aborda el problema(s) a partir de la pregunta? Código sólo respuestas no son muy útiles, especialmente para los más lectores que tropezar con este post. Gracias!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea