Как определить, была ли затронута UILabel?

Я пытаюсь определить, был ли затронут 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];
.
.
.    

Затем я пишу обратный вызов.

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

Проблема прямо сейчас, независимо от того, где я касаюсь в Просмотре, открывается Url. Как определить, был ли затронут только мой ярлык?

Ответы

Ответ 1

Если вы добавите ярлык в класс, вы можете сделать хитовую проверку на вашем экране в событии касания с помощью:

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

Кроме того, не забудьте освободить URL-адрес, который вы выделяете (в противном случае вы протекаете).

Ответ 2

Вы можете сделать это без переопределения штрихов. Используйте распознаватели жестов.

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

[label addGestureRecognizer:recognizer];

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

Ответ 3

Я думаю, что лучший способ для дескриптора - установить флаг для каждой части uilabel, а затем указать номер флага из кода,

label.userInteractionEnabled = YES;


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

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

Ответ 4

Решение Eugene работает, но у вас должно быть включено "взаимодействие с пользователем" в вашем файле NIB. Или как у Махьяра с меткой .userInteractionEnabled = YES.

Вот мое решение, так как у меня были две отдельные метки, которые я хотел захватить. И у меня включено "взаимодействие с пользователем" в моем файле nib.

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

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

Надеюсь, это поможет.

Ответ 5

Вы также можете добавить невидимый (не текст или изображение) UIButton в качестве подзадачи того же размера, что и ваш ярлык. Это имеет дополнительное преимущество: не захватывать другие типы касаний, например, касаться другой области экрана, которая случайно скользит на ваш ярлык, а затем поднимается. Он также может считаться более чистым кодом.

Ответ 6

Еще один поздний ответ...

Как и @Kevin Sylvestre, вы можете проверить касание UILabel, переопределив -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event в вашем контроллере вида.

Однако, вместо того, чтобы проверять, находится ли касание с адресом UILabel, мне легче проверить, было ли прикосновение к "представлению" UILabel (помните, что UILabel наследуется от 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
    }
}

Этот метод может быть легко применен к другим объектам интерфейса, которые наследуются от UIView.

Кроме того, для UILabel также необходимо, чтобы "взаимодействие с пользователем" реагировало на событие касания. Это можно сделать в интерфейсе Builder (Attributes Inspector > View > User Interaction Enabled) или программно - например: self.myLabel.userInteractionEnabled = YES;