2011-10-10 7 views
29

Estoy utilizando el objeto UITableViewCell en el estilo UITableViewCellStyleSubtitle (es decir, una vista de la imagen de la izquierda, etiqueta de texto en negrita y en virtud de que una etiqueta de texto detalle) para crear mi mesa. Ahora necesito detectar toques en el UIImageView y también conocer el indexpath/cell en el que se hizo clic en la vista de la imagen. Intenté usarCómo detectar toques en UIImageView del objeto UITableViewCell en el estilo UITableViewCellStyleSubtitle

cell.textLabel.text = @"Sometext"; 
NSString *path = [[NSBundle mainBundle] pathForResource:@"emptystar1" ofType:@"png"]; 
UIImage *theImage = [UIImage imageWithContentsOfFile:path]; 
cell.imageView.image = theImage; 
cell.imageView.userInteractionEnabled = YES; 

Pero no está funcionando. Cada vez que se hace clic en la imagen, se llama al didSelectRowAtIndexPath:. No quiero crear un UITableViewCell por separado y agregarle un botón personalizado. ¿Hay alguna forma de detectar toques en el UIImageView?

Respuesta

75

En el método de cellForRowAtIndexPath añadir este código

cell.imageView.userInteractionEnabled = YES; 
cell.imageView.tag = indexPath.row; 

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)]; 
tapped.numberOfTapsRequired = 1; 
[cell.imageView addGestureRecognizer:tapped]; 
[tapped release]; 

Y a continuación, para comprobar qué imageView se ha hecho clic, compruebe el indicador en selector método

-(void)myFunction :(id) sender 
{ 
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender; 
    NSLog(@"Tag = %d", gesture.view.tag); 
} 
+3

Esto está roto en iOS 5.0 (tal vez 5.0.1 también). Véase la respuesta por @ Andrew – bandejapaisa

+0

El uso de un UILabel en lugar de un UIImageView y esto funciona en iOS 5.1 – ChrisP

+0

Mostraste gran manera. Gracias. –

6

Una forma de hacerlo es crear un UIImageView a partir de su imagen y agregarle un reconocedor de gestos. Véase el siguiente ejemplo

//Create ImageView 
UIImageView *theImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"emptystar1.png"]]; 
theImageView.userInteractionEnabled = YES; 

//Add Gesture Recognizer 
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageSelectedInTable)]; 
tapped.numberOfTapsRequired = 1; 
[theImageView addGestureRecognizer:tapped]; 
[cell addSubview:theImageView]; 

//Memory Cleanup 
[tapped release]; 
[theImageView release]; 

-(void)imageSelectedInTable 
{ 
    NSLog(@"Selected an Image"); 
} 

Sin embargo, usted ahora va a replantear sus células más ya no se puede simplemente utilizar la propiedad UIImageView del UITableViewCell ya que es de sólo lectura.

+0

Fijación del reconocedor gesto a 'cell.imageView' debería funcionar. Readonly 'imageView' no significa que no se puedan invocar métodos sobre él. –

+2

aahrens Thanx .. funciona bien .. :) El único problema que estoy enfrentando ahora es saber qué imagen se ha seleccionado. ¿Hay alguna manera de enviar argumentos a @selector (imageSelectedInTable :) ?? Revisé el "id" usando dos puntos, pero su objeto UITapGestureRecognizer. Necesito el indexpath en el que está presente la imagen. Cuando traté @selector (imageSelectedInTable: indexPath) la aplicación se estrelló .. – Shri

+1

Funciona !! Me olvidé de agregar "imageView.userInteractionEnabled = YES;" – jovhenni19

18

La solución aceptada es actualmente roto en IOS 5.0. El error provoca que el reconocedor de gestos de la vista de imagen nunca se active. A través de la investigación en los foros oficiales de desarrolladores encontré que este es un error conocido en iOS 5.0. Es causado por una implementación interna que causa -gestureRecognizerShouldBegin: para devolver NO. El error aparece cuando configura el delegado del reconocedor de gestos en la subclase personalizada UITableViewCell.

La solución es para anular -gestureRecognizerShouldBegin: en el delegado del reconocedor gesto y volver . Este error debería solucionarse en una versión futura de iOS 5.x. Esto solo es seguro siempre que no esté utilizando la nueva API de copiar/pegar UITableViewCell.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    return YES; 
} 
+0

¡Buena captura! Entonces, ¿la solución es proporcionar un delegado al reconocedor de gestos, darle un método 'gestureRecognizerShouldBegin:' y devolver 'SÍ'? – dasblinkenlight

+0

@dasblinkenlight sí, exactamente. Debe tenerse en cuenta que esto es seguro siempre que no esté utilizando la nueva copia de la celda y pegue las API. – Andrew

+5

Implementé este método y configuré el delegado en uno mismo, pero nunca se dispara nada.¿Alguien sabe cuál es el estado de este problema en iOS 5.1? – Rob

0

Este problema es:

  • Agregar ImageView en TableViewCell
  • evento Haga clic en ImageView diferente de evento Haga clic en TableViewCell

-> Los siguientes códigos funcionan correctamente conmigo :

cell.imageView.image = [UIImage imageNamed:@"my_image.png"]; 
[cell.imageView setUserInteractionEnabled:YES]; 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTapGestureCaptured:)];  
[cell.imageView addGestureRecognizer:singleTap]; 

y la función "singleTapGestureCaptured"

- (void)singleTapGestureCaptured:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"Left Image clicked"); 
} 
15

Para Swift, en su método cellForRowAtIndexPath añadir este código

cell.imageView?.userInteractionEnabled = true 
cell.imageView?.tag = indexPath.row 

var tapped:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "TappedOnImage:") 
tapped.numberOfTapsRequired = 1 
cell.imageView?.addGestureRecognizer(tapped) 

Y a continuación, para comprobar qué imageView se ha hecho clic, compruebe el indicador en el método de selección

func TappedOnImage(sender:UITapGestureRecognizer){ 
    println(sender.view?.tag) 
} 
+0

¿por qué esto es downvoted? – Esqarrouth

+0

Esto terminó siendo el truco para mí. La interacción del usuario se deshabilitó para mí. Gracias por terminar horas de depuración =) –

2

sólo cómo la información adicional, en mi caso tuve que responder a un gesto de pulsar sobre un archivo de imagen de una celda de la tabla recuperada de NSFetchedResultsContro ller, entonces necesitamos el indexPath, no la fila, así que decidí usar la imagen que se hizo clic en lugar de la información de la fila. He definido una variable para la imagen:

var imgSelected: UIImageView? = nil 

añadí el reconocedor gesto a la imageView (imgZona):

public override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(Storyboard.CellReuseIdentifier, forIndexPath: indexPath) as! ZonasTableViewCell 
    let zona = fetchedResultsController.objectAtIndexPath(indexPath) as! Zona 

    cell.infoZona = zona 

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:Selector("imageTapped:")) 

    cell.imgZona?.addGestureRecognizer(tapGestureRecognizer) 
    cell.imgZona?.userInteractionEnabled = true 

    return cell 
} 

y en el método de "imageTapped" I recuperó la imagen y se guarda en la variable "imgSelected":

func imageTapped(sender: UITapGestureRecognizer) { 

    imgSelected = sender.view as? UIImageView 
    self.performSegueWithIdentifier("MuestraImagen", sender: self) 
} 

por último, en el método "prepareForSegue" me envió la imagen de la viewController dedica a mostrar la imagen girada:

override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let identifier = segue.identifier { 
     switch identifier { 
     case "MuestraImagen": 
      if let vc = segue.destinationViewController as? MuestraImagenViewController { 
       if imgSelected != nil { 
        if let img = imgSelected!.image { 
         vc.imgPuente = img 
        } 
       } 
      } 
     default: break 
     } 
    } 
} 
Cuestiones relacionadas