Tap Gesture en parte de UILabel

Podría agregar con éxito gestos de toque a una parte de UITextView con el siguiente código:

UITextPosition *pos = textView.endOfDocument;// textView ~ UITextView for (int i=0;i<words*2-1;i++){// *2 since UITextGranularityWord considers a whitespace to be a word UITextPosition *pos2 = [textView.tokenizer positionFromPosition:pos toBoundary:UITextGranularityWord inDirection:UITextLayoutDirectionLeft]; UITextRange *range = [textView textRangeFromPosition:pos toPosition:pos2]; CGRect resultFrame = [textView firstRectForRange:(UITextRange *)range ]; UIView* tapViewOnText = [[UIView alloc] initWithFrame:resultFrame]; [tapViewOnText addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(targetRoutine)]]; tapViewOnText.tag = 125; [textView addSubview:tapViewOnText]; pos=pos2; } 

Deseo imitar el mismo comportamiento en un UILabel . El problema es que UITextInputTokenizer (utilizado para tokenizar las palabras individuales) se declara en UITextInput.h , y solo UITextView y UITextField ajustan a UITextInput.h ; UILabel no lo hace. Hay una solución para esto ??

Puede intentar https://github.com/mattt/TTTAttributedLabel y agregar un enlace a la label. Cuando se presiona el enlace, se obtiene una acción, por lo que parte de la label de clic funciona solo lo que tiene para personalizar la parte del enlace de la label. Intenté esto en el pasado y funcionó sin problemas, pero mi cliente no estaba interesado en utilizar un componente de terceros, así que duplicé esta funcionalidad usando UIWebView y HTML.

Prueba esto. Deja que tu label sea label :

  //add gesture recognizer to label UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] init]; [label addGestureRecognizer:singleTap]; //setting a text initially to the label [label setText:@"hello world i love iphone"]; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint touchPoint = [touch locationInView:self.view]; CGRect rect = label.frame; CGRect newRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width/2, rect.size.height); if (CGRectContainsPoint(newRect, touchPoint)) { NSLog(@"Hello world"); } } 

Al hacer clic en la primera mitad de la label funcionará (Da salida de logging). No la otra mitad.

Una opción sería utilizar un UITextView no editable en lugar de un UILabel. Por supuesto, esto puede o no ser una solución adecuada dependiendo de sus necesidades exactas.

Aquí hay una biblioteca con peso ligero especialmente para enlaces en UILabel FRHyperLabel .

Para lograr un efecto como este:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque quis blandit eros, sit amet vehicula justo. Nam en la urna neque. Maecenas ac sem eu sem porta dictum nec vel tellus.

usar el codigo:

 //Step 1: Define a normal attributed string for non-link texts NSString *string = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque quis blandit eros, sit amet vehicula justo. Nam at urna neque. Maecenas ac sem eu sem porta dictum nec vel tellus."; NSDictionary *attributes = @{NSFontAttributeName: [UIFont prefernetworkingFontForTextStyle:UIFontTextStyleHeadline]}; label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes]; //Step 2: Define a selection handler block void(^handler)(FRHyperLabel *label, NSString *substring) = ^(FRHyperLabel *label, NSString *substring){ NSLog(@"Selected: %@", substring); }; //Step 3: Add link substrings [label setLinksForSubstrings:@[@"Lorem", @"Pellentesque", @"blandit", @"Maecenas"] withLinkHandler:handler]; 

Este es un código básico sobre cómo puede agregar UITapGestureRecognizer a su control;

 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; [MyLabelName addGestureRecognizer:singleTap]; [self.view addSubView:MyLabelName] 

Este es el método que llama al MyLabelName su MyLabelName ;

 -(void)handleSingleTap:(UILabel *)myLabel { // do your stuff; }