Как я могу определить, была ли затронута UILabel? - PullRequest
14 голосов
/ 29 марта 2010

Я пытаюсь определить, была ли затронута 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-адрес. Как определить, был ли затронут только мой ярлык?

Ответы [ 6 ]

20 голосов
/ 29 марта 2010

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

- (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-адрес (в противном случае у вас есть утечка).

19 голосов
/ 02 августа 2011

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

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

[label addGestureRecognizer:recognizer];

- (void)tapAction {
  NSLog(@"tap performed");
}
4 голосов
/ 17 января 2012

Решение Eugene работает, но в вашем файле NIB должна быть отмечена галочка «включено взаимодействие с пользователем». Или, как Махьяр, с label.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];

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

4 голосов
/ 19 июля 2011

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

label.userInteractionEnabled = YES;


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

    if(touch.view.tag == uurflagnumber)
    NSlog(@"touched");
} 
1 голос
/ 29 марта 2010

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

0 голосов
/ 21 июля 2013

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

Как и предполагает @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 также необходимо включить «взаимодействие с пользователем», чтобы реагировать на событие касания. Это можно сделать в Интерфейсном Разработчике (Инспектор Атрибутов> Представление> Взаимодействие с пользователем включено) или программно - например: self.myLabel.userInteractionEnabled = YES;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...