2010-03-29 10 views
14

Estoy tratando de determinar si se tocó un UILabel y, de ser así, hacer algo. Give ..¿Cómo puedo determinar si se tocó un UILabel?

. 
. 
. 
UILabel * site = [[UILabel alloc] initWithFrame:CGRectMake(0, 185, 320, 30)]; 
site.text = [retriever.plistDict valueForKey:@"url"]; 
site.textAlignment =UITextAlignmentCenter; 
site.backgroundColor = [UIColor clearColor]; 
site.textColor = [UIColor whiteColor]; 
site.userInteractionEnabled = YES; 
[theBgView addSubview:site]; 
[site release]; 
. 
. 
.  

Luego escribo la devolución de llamada.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    retriever = [PListRetriever sharedInstance]; 
    CGPoint pt = [[touches anyObject] locationInView: self]; 
     NSURL *target = [[NSURL alloc] initWithString:[retriever.plistDict valueForKey:@"url"]]; 
     [[UIApplication sharedApplication] openURL:target]; 
    } 

El problema es ahora, no importa a dónde toque en la Ver la URL que se está abriendo. ¿Cómo puedo determinar si solo se tocó mi etiqueta?

+6

¿Por qué no simplemente reemplaza su etiqueta con un botón? – zonble

Respuesta

20

Si se agrega la etiqueta de la clase, se puede hacer una prueba de posicionamiento en su vista en el caso de contacto con:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])) 
    { 
    NSURL *target = [[NSURL alloc] ...]; 
    ... 
    } 
} 

Además, no se olvide de liberar la URL a asignar (de lo contrario estás goteando).

+0

Sí, lo que dijo. Excelente respuesta Kevin! – Jordan

+0

Esto me sirvió con gestos –

1

También podría agregar un invisible (no texto o imagen) UIButton como una subvista del mismo tamaño que su etiqueta. Esto tiene el beneficio adicional de no capturar otros tipos de toques, como un toque en otra área de la pantalla que se desliza accidentalmente sobre la etiqueta y luego se levanta. También se puede considerar un código más limpio.

4

Creo que la mejor manera de mango es establecer bandera para cada parte UILabel y luego dar el número de la bandera del código,

label.userInteractionEnabled = YES; 


-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [touches anyobject]; 

    if(touch.view.tag == uurflagnumber) 
    NSlog(@"touched"); 
} 
19

Usted puede hacer esto sin anulando touchesBegan. Usa los reconocedores de gestos.

UILabel *label = ...; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *recognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)] autorelease]; 

[label addGestureRecognizer:recognizer]; 

- (void)tapAction { 
    NSLog(@"tap performed"); 
} 
+0

lo siento, no funcionó para mí ...(nada activado en absoluto) – cV2

+0

Esto puede ser causado por una variedad de opciones. Por ejemplo, es posible que su toque se cancele desde una capa que oscurece la etiqueta en la que está colocando el reconocedor de gestos o la propiedad userInteractionEnabled de su vista podría establecerse en NO en algún momento mientras realiza la acción de tap. Agregue la etiqueta como el último objeto de la matriz de subvistas de la vista de destino y vuelva a intentarlo. – Eugene

+0

muchas gracias por su respuesta, userInteractionEnabled se configuró en habilitado, hice una pequeña solución que permitió al usuario cumplir todas las acciones necesarias. ¡gracias! – cV2

4

solución de Eugene funciona pero se debe tener "la interacción del usuario habilitado" marcada en su archivo SEMILLA. O como Mahyar tiene con label.userInteractionEnabled = YES.

Aquí está mi solución ya que tenía dos etiquetas separadas de las que quería capturar toques. Y tengo habilitada la "interacción del usuario habilitada" en mi archivo de punta.

UITapGestureRecognizer *theSpeedTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[speedLabel addGestureRecognizer:theSpeedTapped]; 

UITapGestureRecognizer *theDirectionTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[directionLabel addGestureRecognizer:theDirectionTapped]; 

Espero que esto ayude.

0

Otra respuesta tardía ...

Como @Kevin Sylvestre sugiere, puede probar para el contacto a través de un UILabel anulando -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event en su controlador de vista.

Sin embargo, en lugar de probar si el toque se encuentra con la rect del UILabel, me resulta más fácil probar si el toque estaba en la 'vista' de UILabel (recuerde que UILabel hereda de UIView).

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    NSSet *touchedViews = [touches valueForKeyPath:@"view"]; 
    if ([touchedViews containsObject:self.myLabel]) { 
     // do something 
    } 
} 

Esta técnica se puede aplicar fácilmente a otros objetos de interfaz que heredan de UIView.

Además, también es necesario que el UILabel tenga la "interacción del usuario habilitada" para reaccionar al evento táctil. Esto se puede hacer en Interface Builder (Atributos Inspector> Ver> Interacción del usuario habilitada) o programáticamente, por ejemplo: self.myLabel.userInteractionEnabled = YES;

Cuestiones relacionadas