简体   繁体   中英

How can I determine if a UILabel was touched?

I am trying to determine if a UILabel was touched and if so do something. Give ..

.
.
.
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];
.
.
.    

Then I write the callback.

 - (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];
  }

The problem is right now, no matter where I touch in the View the Url is being opened. How do I determine if only just my label was touched?

If you add the label to the class, you can do a hit-test on your view in the touch event with:

- (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] ...];
    ...
  }
}

Also, don't forget to release the URL you allocate (otherwise you are leaking).

You can do this without overriding touchesBegan. Use gesture recognizers.

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

[label addGestureRecognizer:recognizer];

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

i think the best way for handle is to set flag for each uilabel part and then give the flag number from the code,

label.userInteractionEnabled = YES;


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

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

Eugene's solution works but you must have "user interaction enabled" ticked in your NIB file. Or as Mahyar has with the label.userInteractionEnabled = YES.

Here is my solution as I had two seperate labels that I wanted to capture touches from. And I have "user interaction enabled" ticked in my nib file.

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

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

I hope this helps.

You could also add an invisible (not text or image) UIButton as a subview the same size as your label. This has the added benefit of not capturing other types of touches, such as a touch on another area of the screen that accidentally slides onto your label and then lifts up. It may also be considered cleaner code.

Another late answer ...

Like @Kevin Sylvestre suggests, you can test for the touch over a UILabel by overriding -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event in your view controller.

However, rather than testing if the touch is located with the rect of the UILabel, I find it easier to test if the touch was on the 'view' of UILabel (remember UILabel inherits from 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
    }
}

This technique can easily be applied to other interface objects that inherit from UIView.

Also, it is also necessary for the UILabel to have 'user interaction enabled' to react to the touch event. This can be done in Interface Builder (Attributes Inspector > View > User Interaction Enabled) or programatically - eg: self.myLabel.userInteractionEnabled = YES;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM